nginx中的break与last指令区别

本文通过实验对比了Nginx配置中rewrite指令的break与last关键字的行为差异。发现break会停止后续location匹配并直接发起重定向请求,而last则会继续查找符合重定向后URL的location。

很多人资料说,last与break的区别在于,last并不会停止对下面location的匹配。我理解上模模糊糊。今天自己来测验了一下。




rewrite 指令末尾的break应该与单独写break作用是不同的,比如:


if ($slow) {
  limit_rate  10k;
  break;
}



nginx对待rewrite中的break使用了单独的代码处理去此命令。




测验一下break与last的区别




location /test1.txt/ {

rewrite /test1.txt/  /test2.txt break;

}

location ~ test2.txt {
return 508;
}


使用break会停止匹配下面的location,直接发起请求www.xxx.com/test2.txt,由于不存在文件test2.txt,则会直接显示404。
使用last的话,会继续搜索下面是否有符合条件(符合重写后的/test2.txt请求)的location。此时,/test2.txt刚好与面location的条件对应上了,进入花括号{}里面的代码执行,这里会返回508。

 

 

 

508是我随便设置的一个数字,反正只是测验而已。直接在屏幕上是看不到显示的。在火狐的firebug中能够看到信息




在nginx的源码中处理break与last完全分成了不同的代码块来处理:

if (ngx_strcmp(value[3].data, "last") == 0) {‘
last = 1;

....................


} else if (ngx_strcmp(value[3].data, "break") == 0) {
regex->break_cycle = 1;
last = 1;
....................
}



从上面看到是对数组的第三个元素专门进行处理。
重写代码"rewrite /2a.txt/ /2b.txt break;"中的break指令刚好是在第四(0开始数刚好是用3访问)个位置处。



理解不准之处。欢迎指正。nginx是用c语言编写的。熟悉c语言就容易看懂源码。我使用c语言少。以后要去补习一下。

Nginx 1.26.0 中,重定向(redirect)和 `break`、`last` 标志通常用于 `rewrite` 指令中,以控制 URI 重写和请求处理流程。这些功能在处理 URL 重写、路径映射以及访问控制等方面非常有用。 ### rewrite 指令的基本语法 ```nginx rewrite regex replacement [flag]; ``` - `regex`:正则表达式,用于匹配请求的 URI。 - `replacement`:匹配成功后替换的 URI 或 URL。 - `flag`:标志位,控制重写的行为,常用的有 `last`、`break`、`redirect`、`permanent`。 ### 标志位的使用 #### `last` - `last` 表示当前的 rewrite 指令执行完毕后,Nginx 将重新处理新的 URI,重新匹配 `location` 块。 - 它不会立即停止处理,而是重新开始整个处理流程。 - 适用于需要多次重写的场景。 示例: ```nginx location / { rewrite ^/last/(.*)$ /new/$1 last; rewrite ^/new/(.*)$ /final/$1 break; } ``` 在这个例子中,当请求 `/last/test` 时,首先会被重写为 `/new/test`,然后由于 `last` 标志,Nginx 会重新处理 URI,再次匹配 `location /`,接着执行第二个 `rewrite`,最终变为 `/final/test`。 #### `break` - `break` 表示当前的 rewrite 指令执行完毕后,立即停止当前的 `rewrite` 处理流程,并使用当前的 URI 继续处理请求。 - 它不会重新匹配 `location` 块,而是直接使用当前的 URI。 示例: ```nginx location / { rewrite ^/break/(.*)$ /new/$1 break; rewrite ^/new/(.*)$ /final/$1 break; } ``` 当请求 `/break/test` 时,会被重写为 `/new/test`,但由于 `break` 标志,第二个 `rewrite` 不会执行,最终的 URI 是 `/new/test`。 #### `redirect` - `redirect` 表示临时重定向(HTTP 状态码 302),返回给客户端一个新的 URL。 - 客户端会重新发起请求到新的 URL。 示例: ```nginx location / { rewrite ^/old-path/(.*)$ http://example.com/new-path/$1 redirect; } ``` 当请求 `/old-path/test` 时,Nginx 会返回 302 重定向到 `http://example.com/new-path/test`。 #### `permanent` - `permanent` 表示永久重定向(HTTP 状态码 301),返回给客户端一个新的 URL。 - 客户端会记住这个重定向,并在未来直接访问新的 URL。 示例: ```nginx location / { rewrite ^/old-path/(.*)$ http://example.com/new-path/$1 permanent; } ``` 当请求 `/old-path/test` 时,Nginx 会返回 301 重定向到 `http://example.com/new-path/test`。 ### `break` 和 `last` 的区别 - `break` 会立即停止当前的 `rewrite` 处理流程,并使用当前的 URI 进行后续处理。 - `last` 会停止当前的 `rewrite` 处理,但会重新开始整个请求处理流程,重新匹配 `location` 块。 ### 示例配置 以下是一个综合示例,展示了 `break` 和 `last` 的使用场景: ```nginx server { listen 80; server_name example.com; location / { # 使用 last 标志,URI 会被重新处理 rewrite ^/last/(.*)$ /new/$1 last; # 使用 break 标志,URI 不会被重新处理 rewrite ^/new/(.*)$ /final/$1 break; # 返回最终的 URI return 200 "Final URI: $request_uri\n"; } location /redirect { # 临时重定向 rewrite ^/redirect/(.*)$ http://example.com/new-redirect/$1 redirect; } location /permanent { # 永久重定向 rewrite ^/permanent/(.*)$ http://example.com/new-permanent/$1 permanent; } } ``` ### 总结 - `break` 用于立即停止当前的 `rewrite` 处理,并使用当前的 URI 进行后续处理。 - `last` 用于停止当前的 `rewrite` 处理,并重新开始整个请求处理流程,重新匹配 `location` 块。 - `redirect` 和 `permanent` 用于返回 HTTP 重定向状态码(302 和 301),分别表示临时和永久重定向。 这些标志位的灵活使用可以帮助你实现复杂的 URL 重写和请求路由逻辑。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值