详解Nginx Rewrite标记last和break的区别
详解Nginx Rewrite标记last和break的区别
**简介:**Nginx Rewrite中在rewrite标志位中last和break的功能都是终止当前location后续匹配,last会使用rewrite后的URL继续匹配后续的其他location,而break会使用rewrite后的URL发起HTTP请求。不会再继续匹配后续的location。再次HTTP请求location匹配时也不会再匹配原rewrite …… break所在的location了
1.1 实验对比
1)配置nginx rewrite
rewrite 配置文件
server {
listen 80;
server_name www.local.com;
root /code/;
location ~ /last {
rewrite ^(.*)$ /result last;
index index.html;
}
location ~ /break {
rewrite ^(.*)$ /result break;
index index.html;
}
location / {
index index.html;
}
location ~ /result {
index index.html;
rewrite ^(.*)$ /test;
}
location ~ /test {
root /code/;
index index.html;
}
}
重载nginx
nginx -t
systemctl reload nginx
2)配置页面文件
mkdir -p /code/test
echo “test” >/code/test/index.html
3)访问测试
访问:www.local.com/break
需要添加hosts解析
server_ip www.local.com
将server_ip替换为nginx服务器的IP地址即可
测试无法访问
原因是因为break在rewrite后会使rewrite后的URL进行HTTP请求,如果rewrite后的URL只想的文件或路径不存在就会报错
访问:www.local.com/last
可以访问到test页面
4)进一步测试
mkdir -p /code/result
echo “result” >/code/result/index.html
访问:www.local.com/break
增加了rewrite……break后的目录和文件后就可以访问了,这里发现通过rewrite……break后的http请求URL依然会匹配location,只是不会匹配原rewrite……break所在的location了这个验证在后边的实验中。
访问:www.local.com/last
可以访问到test页面
5)结论说明
匹配的过程:
访问www.local.com/last时匹配到了location /last——rewrite到/result last——停止匹配当前location——使用rewrite后的规则匹配server中所有的location(包含rewrite所在的location)——匹配到result——再次rewrite到/test——访问test中的index.html
访问www.local.com/breck时匹配到了location /break——rewrite到/result——break机制停止当前location匹配,并使用rewrite的URL地址再次发起HTTP请求——访问www.local.com/result,这里要注意,访问的路径必须存在,如果不存在就会报404,如果路径存在文件不存在就会报403——result资源路径存在——访问location /result——/result中再次rewrite到/test——最终访问test中的index.html
1.2 Rewrite last和break匹配模式验证
1)Rewrite last跳转验证
server {
listen 80;
server_name www.local.com;
root /code/;
location /download/ {
rewrite ^(/download)/media/(.*)\..*$ $1/mp3/$2.mp3 ;
rewrite ^(/download)/music/(.*)\..*$ $1/audio/$2.mp3 last;
rewrite ^(/download)/audio/(.*)\..*$ $1/music/$2.mp3 last;
}
}
测试文件:
mkdir -p /code/download/{autio,music}
准备一个MP3文件放入创建的两个目录
/code/download/autio/1.mp3
/code/download/music/1.mp3
访问:http://www.local.com/download/music/1.mp3
测试结果:
结论:rewrite……last会在rewrite后再次进行location并且也包含原rewrite……last表达式所在的location,所以会出现循环的在第二条和第三条跳转,知道达到rewrite上限10次就会出现500错误
2)rewrite break跳转验证
server {
listen 80;
server_name www.local.com;
root /code/;
location /download/ {
rewrite ^(/download)/media/(.*)\..*$ $1/mp3/$2.mp3 ;
rewrite ^(/download)/music/(.*)\..*$ $1/audio/$2.mp3 break;
rewrite ^(/download)/audio/(.*)\..*$ $1/music/$2.mp3 last;
}
}
测试文件:
/code/download/autio/1.mp3
/code/download/music/1.mp3
访问:http://www.local.com/download/music/1.mp3
测试结果:
结论:rewrite……break语句匹配到URL后就会使用新URL进行请求,并且重新匹配location(见上例实验),但是匹配时会排除原rewrite……break语句所在的location,因此在第一次匹配到第二句rewrite后得到download/audio/1.mp3后就会去获取资源。
** 以上结果只是个人见解,如有不同看法欢迎评论交流**