nginx last和break 区别

本文通过实例对比了Nginx配置文件中rewrite指令使用last与break关键字的不同效果。last会根据重写规则重新发起请求并重新匹配location,而break则仅跳过当前rewrite阶段继续执行后续阶段。

今天在开发公司官网:http://www.zstime.com/时遇到一个问题,在写rewrite的时候,纠结到底是用last还是break,

后面查看了一下资料,发现它们区别主要是:


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


我们来看一个例子:

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的错误。

 

请求: http://dcshi.com/last/***
输出: test page
分析: last与break最大的不同是,last会重新发起一个新请求,并重新匹配location,所以对于/last,重新匹配请求以后会匹配到/test/,所以最终对应的content阶段的输出是test page;

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 重写请求路由逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值