nginx通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。该模块需要PCRE支持,应在编译nginx时指定PCRE源码目录。
可以在 http 域中打开 rewrite 日志:
rewrite_log on; # 打开rewrite-log,开启时error——log中记录notice级别的重写日志
Rewrite 可以出现在四个地方
- server 域中的任何地方;
- server 域中的 if 配置中;
- location 域中的任何地方;
- location 域中的 if 配置中;
Rewrite 标志位总共有5种
redirect/permanent/break/last/留空;
server 域中的 rewrite
优先级: 优先执行 rewrite 部分,然后再去匹配 location 块 (不论 rewrite 的位置在 location 前还是后)
break/last/留空
server 域中 break/last/留空 作用相同,都会去匹配 location,建议留空
server {
location ^~ /rewrite1 {
echo "rewrite1 page";
}
rewrite ^/origin1(.*) /rewrite1$1; #last/break/留空 作用相同
}
# http://127.0.0.1/origin1 输出 rewrite1 page
# 不论 rewrite 在 location 之前还是之后,输出结果相同
redirect/permanent
参考 location 中的 redirect/permanent
location 域中的 rewrite
break
直接使用当前资源,执行 location 里余下的语句,完成本次请求,地址栏url不变;
server {
location ^~ /origin2 {
rewrite ^/origin2(.*) /rewrite2$1 break;
echo "origin2 page";
}
location ^~ /rewrite2 {
echo "rewrite2 page";
}
}
# http://127.0.0.1/origin2 输出 origin2 page
# 如果 location 中 rewrite 后是对静态资源的请求,不需要再进行其他匹配,一般要使用break
# /origin2/里的echo 指令注释的情况下,然后再次访问/origin2/xx会报404,尝试找/rewrite2/xx这个html页面并输出内容,
事实上,这个页面不存在,所以会报404的错误
last 与 留空
发起一个新请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏url不变;
server {
location ^~ /origin3 {
rewrite ^/origin3(.*) /rewrite3$1 last; # last与留空作用相同
echo "origin3 page";
}
location ^~ /rewrite3 {
echo "rewrite3 page";
}
}
# http://127.0.0.1/origin3 输出 rewrite3 page
# last 与 留空 都输出 rewrite3 page
redirect
返回302临时重定向,地址栏显示重定向后的url,爬虫不会更新url(因为是临时)
server {
location ^~ /origin4 {
rewrite ^/origin4(.*) /rewrite4$1 redirect;
}
location ^~ /rewrite4 {
echo "302 redirect page";
}
}
# http://127.0.0.1/origin4 302 redirect page
# 同时地址栏的 url 变为 http://127.0.0.1/rewrite4
# 爬虫不会更新 url
permanent
返回301永久重定向, 地址栏显示重定向后的url,爬虫更新url
server {
location ^~ /origin5 {
rewrite ^/origin5(.*) /rewrite5$1 permanent;
}
location ^~ /rewrite5 {
echo "301 permanent page";
}
}
# http://127.0.0.1/origin5 301 permanent page
# 同时地址栏的 url 变为 http://127.0.0.1/rewrite5
# 爬虫更新url
alias 中 rewrite
server {
location ^~ /static {
alias /home/www.test.com/static/;
rewrite ^/static(.*) /test$1 last;
}
location ^~ /test {
echo "test page";
}
#http://120.27.105.225/static/abc last -> test page
#http://120.27.105.225/static/abc break -> test page 500 Internal Server Error
#???http://120.27.105.225/static/a.gif -> /test/a.gif
}
#使用alias指定源:必须使用last
# 如果location中rewrite后是对静态资源的请求,不需要再进行其他匹配,一般要使用break或不写
break
语法:break; 作用域:server,location,if
停止执行当前虚拟主机的后续rewrite指令集, break指令实例:
if ($slow) {
limit_rate 10k;
break;
}