总结: rewrite 可以在 server location 块, 正则比配的时候才重写,所以多条 rewrite 顺序靠前且匹配的优先执行。

break跳出rewrite阶段,不会在匹配,进入输出阶段。 last 类似重新发起请求,所以会重新进行匹配。

转自:http://blog.sina.com.cn/s/blog_4f9fc6e10102ux0w.html

http://blog.cafeneko.info/2010/10/nginx_rewrite_note/ 或者 http://yuanhsh.iteye.com/blog/1321982

nginx 的官方注释是这样的:

laststops processing the current set of ngx_http_rewrite_module directives followed by a search for a new location matching the changed URI;breakstops 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位置,执行结果不变,说明这个和位置无关。

转载于:https://blog.51cto.com/tenderrain/2150325

nginx rewrite 指令last break区别最详细的解释相关推荐

  1. nginx php 此网页包含重定向循环,详解常用的nginx rewrite重写规则

    本文提供一些常用的rewrite重写规则,用来美化网页的链接.规则里面的$1$2你不知道是怎么来的话,只要记住,第一个()里面的是$1,第二个()里面的是$2. 请求的URL是给人看的,重写后的URL ...

  2. nginx rewrite与proxy_pass详解

    最近接触到了nginx的 proxy_pass 与 rewrite,网上查了很多资料,在这里记录一下,学习学习. 说明 rewrite 一.介绍 rewrite <regex> <r ...

  3. Nginx中的rewrite指令(break,last,redirect,permanent)

    转载自:Nginx中的rewrite指令(break,last,redirect,permanent) rewite 在server块下,会优先执行rewrite部分,然后才会去匹配location块 ...

  4. nginx rewrite规则语法(关于break和last分析得很好)

    在新主机的迁移过程中,最大的困难就是WP permalink rewrite的设置. 因为旧主机是用的Apache, 使用的是WP本身就可以更改的.htaccess,没有太大的难度.而这次在VPS上跑 ...

  5. Nginx的rewrite之rewrite指令

    rewrite指令 该指令通过正则表达式的使用来改变URI.可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理. URL和URI的区别: URI:统一资源标识符 URL:统一资源定位符 ...

  6. nginx的http_rewrite模块的rewrite指令

    rewrite 指令 new,2022-06-07,chenxizhan1995@163.com Module ngx_http_rewrite_module 该指令是 ngx_http_rewrit ...

  7. nginx rewrite if指令剖析

    0. 前言 nginx的if功能确实是弱得可以,严重影响了生产效率.故此,先提出严正抗议! 1. if指令配置的实现 对于这个功能奇弱的if指令,nginx实现得还特别复杂.下面将对其实现进行剖析. ...

  8. nginx rewrite break

    多个location有rewrite的时候需要注意在rewrite之后使用break可以避免多次location,rewrite之后的proxy_pass不会因break而失效. server {li ...

  9. Nginx Rewrite详解

    Nginx Rewrite详解 引用链接:http://blog.cafeneko.info/2010/10/nginx_rewrite_note/ 原文如下: 在新主机的迁移过程中,最大的困难就是W ...

最新文章

  1. 吴恩达:人工智能寒冬不会到来,但我们太乐观了
  2. WIN8.1 PRO RTM VOL.2013.09.18
  3. 今年最新整理的《高频Java面试题集合》,聪明人已经收藏了!
  4. struts2拦截器的实现原理及源码剖析
  5. WINCE 开机自动弹USB连接窗口问题(已解决)
  6. javascript之作用域
  7. prototype.js 和jquery-1.6.2.js冲突问题解决方法
  8. 选择Vert.x的3个理由
  9. 安卓开发环境_我的安卓开发环境
  10. Linux内核 eBPF基础:perf(1):perf_event在内核中的初始化
  11. 记忆与思考再到使用需要时间吗?
  12. table固定表头行及列,其中行包含合并单元格
  13. Klevgrand Tines for Mac(电钢琴模拟插件)
  14. ironpython使用dictionary_Ironpython引用C#数据结构
  15. 联想 缺少计算机所需的介质驱动程序,联想笔记本缺少驱动应该怎么办
  16. TBSchedule调度平台疑难解答
  17. 那些便宜的vps,你敢用吗?企业该如何选择云服务器?
  18. myelipse修改页面后 浏览器无变化
  19. 执念斩长河专栏线代概率--目录
  20. 《公安机关办理刑事案件电子数据取证规则》

热门文章

  1. spring 3.X与jdk 1.8不兼容
  2. 转_前端开发技术概要
  3. 白领们注意啦:“过劳死”27个危险信号!
  4. Redis消息通知系统的实现
  5. CentOS重启启动Apache,VNC
  6. 用“逐步排除”的方法定位Java服务线上“系统性”故障
  7. Win32 环境下的堆栈
  8. Ruby调用shell命令
  9. android 耳机红外线,红外线耳机制作方法
  10. java a运算顺序_Java中计算顺序的规则是什么?