引言
Rewrite
Rewrite功能
Nginx Rewrite规则
- 实现对URL的重写
- 对匹配的URL进行重定向。
它的匹配依赖于正则表达式
场景
- URL访问跳转,支持开发设计
页面跳转、兼容性支持、展示效果等 - SEO优化
- 维护
后台维护、流量转发 - 安全
配置语法
Syntax:rewrite regex replacement[flag];
Default:--
Context:server,location,if
示例:
rewrite ^(.*)$ /pages/maintain.html break;
上面的示例使用场景:在对后端升级维护时,可将所有请求重定向到维护页面。
正则表达式
| . | 匹配除换行符以外的任意字符 |
| ? | 重复0次或1次 |
| + | 重复1次或多次 |
| * | 贪婪匹配,有多少就匹配多少 |
| \d | 匹配数字 |
| ^ | 匹配字符串的开始 |
| $ | 匹配字符串的结束 |
| {n} | 重复n次 |
| {n,} | 重复n次或多次 |
| [c] | 匹配单个字符c |
| [a-z] | 匹配a-z小写字母的任意一个 |
| \ | 转义字符 |
| () | 用于匹配括号之间的内容,通过$1、$2调用 |
rewrite index\.php$ /pages/maintain.html break;
if ($http_user_agent ~ MSIE){
rewrite ^(.*)$ /msie/$1 break;
}
这里介绍一个终端工具:pcretest

re> /(\d+)\.(\d+)\.(\d+)\.(\d+)/
data> 192.168.2.2
flag
标记位,标记nginx rewrite规则对应的类型
| last | 停止rewrite检测 |
| break | 停止rewrite检测 |
| redirect | 返回302临时重定向,地址栏会显示跳转后的地址 |
| permanent | 返回301永久重定向,地址栏会显示跳转后的地址 |
location ~ ^/break{
rewrite ^/break/test/ break;
}
location ~ ^/last{
rewrite ^/last/test/ last;
}
location /test/{
default_type application/json;
return 200 '{"status":"success"}';
}
break 会停止向下扫描
而last如果找不到对应的资源文件会重新发起一个请求,继续向下匹配规则。
Rewrite改写规则使用场景
场景如下:
- 假设我linux服务器上存在一个目录/opt/app/code,并且在此目录下有分层目录,如11/22/course_33.html
- 即我们通过http://servername/course/11/22/course_33.html地址的访问可获取到资源
- 因为本身Url地址过长,难以被SEO搜索并收录,因此要做rewrite改写。
打开test_rewrite.conf:
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
root /opt/app/code
location / {
rewrite ^/course-(\d+)-(\d+)-(\d+)\.html$ /course/$1/$2/course_$3.hmtl break;
if($http_user_agent ~* Chrome){
rewrite ^/nginx http://coding.imooc.com/class/121.html redirect;
}
#-f的作用是判断这个路径是否存在
if(!-f $request_filename){
rewrite ^/(.*)$ http://www.imooc.com/class/$1 redirect;
}
index index.html index.htm;
}
}
Rewrite规则优先级
执行server块的rewrite指令
执行location匹配
执行选定的location中的rewrite