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