总结: rewrite 能够在 server location 块, 正则比配的时候才重写,因此多条 rewrite 顺序靠前且匹配的优先执行。php
break跳出rewrite阶段,不会在匹配,进入输出阶段。 last 相似从新发起请求,因此会从新进行匹配。html
转自:http://blog.sina.com.cn/s/blog_4f9fc6e10102ux0w.htmlnginx
http://blog.cafeneko.info/2010/10/nginx_rewrite_note/ 或者 http://yuanhsh.iteye.com/blog/1321982spa
nginx 的官方注释是这样的:server
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阶段。htm
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阶段,并执行本请求后续的执行阶段…blog
咱们来看一个例子:it
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的错误。io
请求: http://dcshi.com/last/***
输出: test page
分析: last与break最大的不一样是,last会从新发起一个新请求,并从新匹配location,因此对于/last,从新匹配请求之后会匹配到/test/,因此最终对应的content阶段的输出是test page;ast
假设你对nginx的运行阶段有一个大概的理解,对理解last与break就没有问题了。
location ~ ^/testtest/ {
default_type text/html;
echo 111;
}
rewrite ^/testtest/ /test.php last;
访问 /testtest/的时候,输出的值是/test.php的内容,显然,重写到rewrite上了,交换rewrite和location位置,执行结果不变,说明这个和位置无关。