Nginx的rewrite规则
实现url重写以及重定向。
场景
- URL访问跳转,支持开发设计
页面跳转、兼容性支持、展示效果等 - SEO优化
- 维护
后台维护、流量转发等 - 安全,使用rewrite可以实现伪静态
语法配置
Syntax:rewrite regex replacement [flag];
Default:默认无
Context:server,location,if
如:rewrite ^(.*)$ /pages/maintain.html breakl
解释:将所有的页面都改成维护页面
,flag:break;
正则表达式
符号 | 作用 |
---|---|
. | 匹配除换行符以外的任意字符 |
? | 重复0次或1次 |
+ | 重复1次或多次 |
* | 重复0次或多次 |
\d | 匹配数字 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
[c] | 匹配单个字符c |
[a-z] | 匹配a-z小写字符的任意一个 |
\ | 转义字符 |
() | 用于匹配括号之间的内容,通过$1、$2调用 |
flag
类型 | 作用 |
---|---|
last | 停止rewrite检测 |
break | 停止rewrite检测 |
redirect | 返回302临时重定向,地址栏会显示跳转后的地址 |
permanent | 返回301永久重定向(缓存,下次访问,自动重定向),地址栏会显示跳转后的地址 |
测试
last与break的区别
在/etc/nginx/conf.d/
下新建一个配置,如下:
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/log/host.access.log main;
root /opt/app/code;
location ~ ^/break {
rewrite ^/break /test/ break;
}
location ~ ^/last {
rewrite ^/last /test/ last;
}
location /test/ {
default_type application/json;
return 200 '{"status":"success"}';
}
}
测试效果
访问HOST/test/
,正常访问,没问题。
访问HOST/break/
,返回404页面找不到。
访问HOST/last/
,正常访问,没问题。
区别
location ~ ^/break {
rewrite ^/break /test/ break;
}
break:匹配到location后,直接从root目录下寻找改写后的链接资源,找到则返回,找不到则返回404页面未找到。
location ~ ^/last {
rewrite ^/last /test/ last;
}
last:匹配到location后,改写字符串,内部相当于重新发起一次请求,然后进到别的location,执行正常流程。
区别:break直接找资源,last发起新的请求进入别的location。
redirect与last的区别
配置文件稍作修改:
location ~ ^/last {
#rewrite ^/last /test/ last;
rewrite ^/last /test/ redirect;
}
访问HOST/last/
,正常访问,发现url变成HOST/test/
。
回顾flag=last,正常访问,但是url不变。
(1)当flag=redirect,使用curl -vL 192.168.174.132/last/
进行测试,发现先请求的/last/
,返回302,再请求的HOST/test/
。
(2)当flag=last,使用curl -vL 192.168.174.132/last/
进行测试,返回200,直接可以获取到内容。
redirect与permanent的区别
location ~ ^/shen {
#rewrite ^/shen http://192.168.174.132/test/ permanent;
rewrite ^/shen http://192.168.174.132/test/ redirect;
}
(1)当flag=redirect,访问HOST/shen
,跳转访问HOST/test/
,url同时变化。F12打开控制台,查看网络,如下:
一个302临时重定向,一个200正常返回。
当关闭Nginx后,再次访问HOST/shen
,则无响应。
(2)当flag=permanent,访问HOST/shen
,跳转访问HOST/test/
,url同时变化。F12打开控制台,查看网络,如下:
一个301永久重定向,一个200正常访问。
当关闭Nginx服务器后,再次访问HOST/shen
,则访问到HOST/test/
,打开F12,看到301的永久重定向是from disk cache
。
说明301永久重定向,是可以缓存的。
rewrite重写规则适用场景
过长的目录结构,不便于搜索引擎收录
配置项:
location / {
rewrite ^/course-(\d+)-(\d+)-(\d+)\.html$ /course/$1/$2/course_$3.html break;
}
当目录结构复杂的时候,嵌套过深,不便于搜索引擎去收录,则可以利用重写规则去重写。
此处flag=break,直接去对应目录下找到资源,返回给客户端($1等是调用前面的正则表达式的括号匹配内容)。
如:访问http://192.168.174.132/course-11-22-33.html
,则会去$root
目录下寻找/course/11/22/course_33.html
,返回给客户端。
对于不同浏览器,进行兼容性跳转
if ($http_user_agent ~* Chrome) {
rewrite ^/nginx http:/www.baidu.com redirect;
}
若浏览器是Chrome,则重定向到指定资源或页面。
若请求资源不存在,则重定向到指定页面
if (!-f $request_filename) {
rewrite ^/(.*)$ http://www.baidu.com/s?wd=$1+$request_filename redirect;
}
if语句的意思是,若$root+request_uri
这个资源文件不存在,则重定向。
rewrite规则优先级
Server>location>指定location