Nginx配置的rewrite编写时last与break的区别分析

2025-05-26 0 34

在使用nginx配置rewrite中经常会遇到有的地方用last并不能工作,换成break就可以,其中的原理是对于根目录的理解有所区别,按我的测试结果大致是这样的。

?

1

2

3

4

5

6

7
location /

{

proxy_pass http://test;

alias /home/html/;

root /home/html;

rewrite "^/a/(.*)\\.html$" /1.html last;

}

在location / { 配置里:
1、使用root指定源:使用lastbreak都可以
2、使用proxy_pass指定源:使用lastbreak都可以
3、使用alias指定源:必须使用last
在location /a/或使用正则的location ~ ^/a/里:
1、使用root指定源:使用lastbreak都可以
2、使用proxy_pass指定源:使用breaklast结果有所区别
3、使用alias指定源:必须使用last
其中区别主要在proxy_pass这个标签上,再看看几个测试结果:

?

1

2

3

4

5

6

7

8

9

10
location /

{

root /home/html;

}

location /a/

{

proxy_pass http://test;

rewrite "^/a/(.*)\\.html$" /1.html last;

}

在这段配置里,使用last访问是可以访问到东西的,不过,它出来的结果是:/home/html/1.html;可我需要的是http://test/1.html?使用break就可以了。

?

1

2

3

4

5

6

7

8

9

10
location /

{

root /home/html;

}

location /a/

{

proxy_pass http://test;

rewrite "^/a/(.*)\\.html$" /a/1.html last;

}

在这段配置里,返回错误,因为last会重新发起请求匹配,所以造成了一个死循环,使用break就可以访问到http://test/a/1.html。
所以,使用last会对server标签重新发起请求,而break就直接使用当前的location中的数据源来访问,要视情况加以使用。一般在非根的location中配置rewrite,都是用的break;而根的location使用last比较好,因为如果配置了fastcgi或代理访问jsp文件的话,在根location下用break是访问不到。测试到rewrite有问题的时候,也不妨把这两者换换试试。
至于使用alias时为什么必须用last,估计是nginx本身就限定了的,怎么尝试break都不能成功。

所以我们再来理解lastbreak的区别:
last: 停止当前这个请求,并根据rewrite匹配的规则重新发起一个请求。新请求又从第一阶段开始执行…
break:相对lastbreak并不会重新发起一个请求,只是跳过当前的rewrite阶段,并执行本请求后续的执行阶段…

我们再来看一个例子:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
server {

listen 80 default_server;

server_name dcshi.com;

root www;

location /break/ {

rewrite ^/break/(.*) /test/$1 break;

echo "break page";

}

location /last/ {

rewrite ^/last/(.*) /test/$1 last;

echo "last page";

}

location /test/ {

echo "test page";

}

}

请求:http://dcshi.com/break/***
输出: break page
分析:正如上面讨论所说,break是跳过当前请求的rewrite阶段,并继续执行本请求的其他阶段,很明显,对于/foo 对应的content阶段的输出为 echo “break page”; (content阶段,可以简单理解为产生数据输出的阶段,如返回静态页面内容也是在content阶段;echo指令也是运行在content阶段,一般情况下content阶段只能对应一个输出指令,如同一个location配置两个echo,最终只会有一个echo指令被执行);当然如果你把/break/里的echo 指令注释,然后再次访问/break/xx会报404,这也跟我们预期一样:虽然/break/xx被重定向到/test/xx,但是break指令不会重新开启一个新的请求继续匹配,所以nginx是不会匹配到下面的/test/这个location;在echo指令被注释的情况下,/break/ 这location里只能执行nginx默认的content指令,即尝试找/test/xx这个html页面并输出起内容,事实上,这个页面不存在,所以会报404的错误。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Nginx配置的rewrite编写时last与break的区别分析 https://www.kuaiidc.com/53720.html

相关文章

发表评论
暂无评论