博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx rewrite 指令last break区别
阅读量:6870 次
发布时间:2019-06-26

本文共 2153 字,大约阅读时间需要 7 分钟。

nginx 的官方注释是这样的:

last   stops processing the current set of ngx_http_rewrite_module directives followed by a search for a new location matching the changed URI;break   stops processing the current set of ngx_http_rewrite_module directives;

 

我们知道nginx运行分十一个执行阶段,上面说提到的ngx_http_rewrite_mode,可以理解为其中一个阶段-rewrite阶段。

typedef enum {    NGX_HTTP_POST_READ_PHASE = 0,    NGX_HTTP_SERVER_REWRITE_PHASE,    NGX_HTTP_FIND_CONFIG_PHASE,    NGX_HTTP_REWRITE_PHASE,           //rewrite阶段在这里    NGX_HTTP_POST_REWRITE_PHASE,    NGX_HTTP_PREACCESS_PHASE,    NGX_HTTP_ACCESS_PHASE,    NGX_HTTP_POST_ACCESS_PHASE,    NGX_HTTP_TRY_FILES_PHASE,    NGX_HTTP_CONTENT_PHASE,    NGX_HTTP_LOG_PHASE} ngx_http_phases;

 

所以我们再来理解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的运行阶段有一个大概的理解,对理解last与break就没有问题了。

location ~ ^/testtest/ {

default_type text/html;

echo 111;

}

rewrite ^/testtest/  /test.php last;

访问 /testtest/的时候,输出的值是/test.php的内容,显然,重写到rewrite上了,交换rewrite和location位置,执行结果不变,说明这个和位置无关。

      本文转自Tenderrain 51CTO博客,原文链接:http://blog.51cto.com/tenderrain/1949254
,如需转载请自行联系原作者
你可能感兴趣的文章
BZOJ-4034: [HAOI2015]树上操作 (线段树+DFS序)
查看>>
maven下载jar包源码配置
查看>>
关于MYSQL通过子查询删除重复数据的for update报错问题解决
查看>>
进程与fork()、wait()、exec函数组
查看>>
ASP.NET入门(1) - 建立和开发ASP.NET 5 项目
查看>>
织梦内页读取栏目banner图
查看>>
技术入股
查看>>
multi-voltage design apr
查看>>
快速生成R语言报告(markdown+Rstudio)
查看>>
WindowsServer2003中IIS支持php的配置
查看>>
原型链、prototype、_proto_那些事
查看>>
Centos 6.4使用本地yum源
查看>>
RedHat 7 静默安装Oracle 12c
查看>>
技术人玩转iPhone4S iOS 5.1.1完美越狱
查看>>
在敏捷测试中如何设计用例
查看>>
使用JSOM创建一个SharePoint网站计数器
查看>>
老硬盘华丽变身高速硬盘
查看>>
IT公司规模对技术人员知识增长率的影响
查看>>
由日企衰败联想到的运维管理问题
查看>>
Outlook中轻松添加LDAP服务
查看>>