详解Nginx Rewrite标记last和break的区别

详解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后就会去获取资源。

** 以上结果只是个人见解,如有不同看法欢迎评论交流**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值