Nginx URL重写

2020-12-31 15:06:58 浏览数 (4)

rewite 规则作用

代码语言:javascript复制
Rewrite规则可以实现对url的重写,以及重定向
 
--作用场景
URL访问跳转,支持开发设计,如页面跳转,兼容性支持,展示效果等
SEO优化
维护:后台维护、流量转发等
安全

rewrite 语法

代码语言:javascript复制
rewrite    <regex>    <replacement>    [flag];
关键字      正则        替代内容          flag标记

--解释
关键字        其中关键字error_log不能改变
正则         perl兼容正则表达式语句进行规则匹配
替代内容    将正则匹配的内容替换成replacement
flag标记   rewrite支持的flag标记

flag 参数

代码语言:javascript复制
last    停止rewrite检测[如果没有匹配到,会继续向下匹配]
break    停止rewrite检测[如果没有匹配到,则不再向下匹配,直接返回结果404]
redirect    返回302临时重定向,地址栏会显示跳转后的地址
permanent    返回301永久重定向,地址栏会显示跳转后的地址
last与break的区别
代码语言:javascript复制
last和break一样,它们都会终止此'location'中其他它rewrite模块指令的执行,但是'last'立即发起新一轮的 'location'匹配,而'break'则不会
代码语言:javascript复制
--'last'参数
root@linux:/# vim /usr/local/nginx/conf.d/www.conf
server {
  listen 80;
  root /www;
location / {
   rewrite ^/www/(.*.html)$ /v1/$1 last;
   rewrite ^/v1/(.*.html)$ /v2/$1 break;
}
}

--验证,发现访问URL'/www/index.html'会被重写为'/v2/index.html’
root@linux:/# curl http://172.16.0.1/www/index.html
my name v2

--请求流程
1:访问'/www/index.html'匹配规则成功,所以'/www/index.html'会被重写为'/v1/index.html',发现'flag'为'last',会重新以'/v1/index.html'进行匹配
2:以'/v1/index.html'重新开始匹配第一条rewrite规则,不符合规则不可以被匹配到,继续向下执行
3:以'/v1/index.html'匹配第二条rewrite规则符合,会被重写为'/v2/index.html'
4:以'/v2/index.html'重新开始匹配第一条rewrite规则,不符合规则不可以被匹配到,继续向下执行
5:以'/v2/index.html'重新开始匹配第二条rewrite规则,不符合规则不可以被匹配到,继续向下执行
6:如果后面没有了rewrite规则,此时就会去'/www/v2/'下找相应的资源对应的资源响应
代码语言:javascript复制
--'break'参数
root@linux:/# vim /usr/local/nginx/conf.d/www.conf
server {
  listen 80;
  root /www;
location / {
   rewrite ^/www/(.*.html)$ /v1/$1 break;
   rewrite ^/v1/(.*.html)$ /v2/$1 last;
}
}

--验证
root@linux:/# curl http://172.16.0.1/www/index.html
my name v1

--请求流程
1:访问'/www/index.html'匹配第一条rewrite规则成功,所以'/www/index.html'会被重写为'/v1/index.html',发现'flag'为'break',此时就会去'/www/v1/'下找相应的资源对应的资源响应,不再向下匹配
redirect与permanent的区别
代码语言:javascript复制
永久重定向就表示该网址已经搬迁到一个永久居住的'新家'
临时重定向就表示该网址搬迁到了一个临时居住的'公寓'
代码语言:javascript复制
--'redirect'参数
--请求的'URL'只要被'redirect'规则匹配到了就立马响应浏览器重定向,后面的规则都不会执行
root@linux:/# vim /usr/local/nginx/conf.d/www.conf
server {
  listen 80;
  root /www;
location / {
  rewrite ^/www/(.*.html)$ http://172.16.0.14 redirect;
  rewrite ^/www/(.*.html)$ /v2/ last;
 }
}

--验证,'-L'选项表示跟随链接重定向
root@linux:/# curl -L 172.16.0.1/www/index.html
hello my ip is '172.16.0.134'
代码语言:javascript复制
--'permanent'参数
--请求的'URL'只要被'permanent'规则匹配到了就立马响应浏览器重定向,后面的规则都不会执行
root@linux:/# vim /usr/local/nginx/conf.d/www.conf
server {
  listen 80;
  root /www;
location / {
  rewrite ^/www/(.*.html)$ http://172.16.0.14 permanent;
  rewrite ^/www/(.*.html)$ /v2/ last;
 }
}

--验证
root@linux:/# curl -L 172.16.0.1/www/index.html
hello my ip is '172.16.0.134'

rewrite 日志

代码语言:javascript复制
--编辑主配置文件,在'http{}'内添加下面的内容
root@linux:/# vim /usr/local/nginx/conf/nginx.conf
http {
.................省略
    error_log /usr/local/nginx/logs/error.log notice;
    rewrite_log on;
}

--重启nginx
root@linux:/# nginx -s reload

--访问网页
root@linux:/# curl -L 172.16.0.1/www/index.html
hello my ip is '172.16.0.134'

--查看日志
root@linux:/# cat /usr/local/nginx/logs/error.log
2020/12/23 22:33:13 [notice] 29613#0: *24 rewritten redirect: "http://172.16.0.14", client: 172.16.0.1, server: , request: "GET /www/index.html HTTP/1.1", host: "172.16.0.1"

实例

代码语言:javascript复制
--用于切换维护页面场景
server {
  listen 80;
  root /www;
location / {
  rewrite ^(.*)$ /maintain.html break;
 }
}
代码语言:javascript复制
--隐藏式跳转'浏览器URL跳转后保持不变'
--请求URI'/www/index.html'转到h'ttp://172.16.0.14/admin'页面
server {
  listen 80;
  root /www;
location /www {
  rewrite ^/www/index.html /admin break;
  proxy_pass http://172.16.0.14;
 }
}
代码语言:javascript复制
--'http'访问强制跳转到'https'
server {
  listen 80;
  root /www;
location / {
  rewrite ^/(.*)$ https://$host$1 permanent;
 }
}

1 人点赞