`
nigelzeng
  • 浏览: 603957 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

nginx里的break和last

阅读更多

break和last是nginx的rewrite_module里的指令,tengine翻译的文档里对这两个的指令解释是:

 

last
停止执行当前这一轮的ngx_http_rewrite_module指令集,然后查找匹配改变后URI的新location;
break
停止执行当前这一轮的ngx_http_rewrite_module指令集;

 

 

就我所知,这两个指令都可以用来实现内部重定向(internal redirect),我经常有疑问,这两个指令具体的区别是什么呢?昨天总算弄清楚了一点,请往下看:

 

我定义了一个虚拟主机 "nigel.zeng.me" :

 

server {
listen 80 default_server;
server_name nigel.zeng.me;
root www;
access_log logs/nigel.log main;

location /foo/ {
    rewrite ^/foo/(.*) /test/$1 break;
          echo "break keyword";
}

location /bar/ {
      rewrite ^/bar/(.*) /test/$1 last;
          echo "last keyword";
}

location /test/ {
       valid_referers none server_names ~nigel\.zeng\.me;
              if ($invalid_referer) {
                        return 403;
                  }
}
}

 

里面定义了的两个location,第一个用来处理 http://nigel.zeng.me/foo/*** 的情况,使用break来做内部重定向,把http://nigel.zeng.me/foo/***  重写为 http://nigel.zeng.me/test/***;

第二个location用来处理http://nigel.zeng.me/bar/*** 的情况,使用last来做内部重定向,也是重定向到http://nigel.zeng.me/test/***。

echo指令是agentzh所编写的echo-nginx-module第三方模块里带的。

 

这里准备的两个url是 http://nigel.zeng.me/foo/index.html 和 http://nigel.zeng.me/bar/index.html。

内部重定向后的页面 http://nigel.zeng.me/test/index.html 如下:


按照tengine的中文文档里介绍的,break指令会停止去匹配新的location,而last指令则会去查找匹配改变后URI的新location,那么按照上面的配置,访问第一个URL “http://nigel.zeng.me/foo/index.html“ 会返回 "break keyword" 字段,而访问 ”http://nigel.zeng.me/bar/index.html“ 则会返回 http://nigel.zeng.me/test/index.html 的结果。

 

OK,看看测试结果:

访问第一个URL “http://nigel.zeng.me/foo/index.html“:

访问第二个URL ”http://nigel.zeng.me/bar/index.html“:

所以从测试结果可以得出以下结论:

1、rewrite后接break指令,完成rewrite之后会执行完当前的location(或者是if)指令里的其他内容(停止执行当前这一轮的ngx_http_rewrite_module指令集),然后不进行新URL的重新匹配。

2、rewrite后接last指令,在完成rewrite之后停止执行当前这一轮的ngx_http_rewrite_module指令集已经后续的指令,进而为新的URL寻找location匹配。

 

结果仅供参考。

 

-----EOF------

 

have fun.

 

-- nigelzeng

 

  • 大小: 32.8 KB
  • 大小: 15.3 KB
  • 大小: 28.6 KB
分享到:
评论
1 楼 snowing0427 2015-01-13  
特地登录来感谢一下楼主~!!!

相关推荐

    Nginx配置的rewrite编写时last与break的区别分析

    在使用nginx配置rewrite中经常会遇到有的地方用last并不能工作,换成break就可以,其中的原理是对于根目录的理解有所区别,按我的测试结果大致是...2、使用proxy_pass指定源:使用last和break都可以 3、使用alias指定

    nginx设置rewrite规则

    总的来说,配置Nginx的rewrite规则是提升Web应用性能和用户体验的关键步骤,需要理解正则表达式和Nginx的配置语法,才能正确有效地实现URL重写。在LNMP环境中,根据实际的部署类型选择合适的配置文件,并确保规则的...

    Nginx 重写规则教程

    替换后的URI可以附加`flag`标志来决定接下来的动作,如`last`、`break`、`redirect`和`permanent`。 **2. 重写规则标志** - **last**:停止处理重写模块指令,根据新的URI匹配新的location。 - **break**:结束...

    Nginx指南和教程.zip

    规则可以基于正则表达式,结合`break`、`last`、`redirect`和`permanent`等标志来控制重写的逻辑。 6. **HTTP缓存机制** Nginx可以通过缓存经常访问的HTTP响应,减少对后端服务器的压力。`proxy_cache`和`proxy_...

    nginx伪静态隐藏.php后缀,在url后补斜杠/

    Nginx 作为一款高性能的 HTTP 和反向代理服务器,提供了丰富的功能支持来实现这一目标。 #### 1. 伪静态技术概述 伪静态是指将动态页面(如 PHP 页面)通过 URL 重写规则转换为静态页面形式的过程,但实际访问时...

    Nginx开发从入门到精通

    理解正则表达式和`break`、`last`、`redirect`、`permanent`等规则结束标记。 4. **SSL/TLS安全配置**:随着HTTPS的普及,配置Nginx支持SSL是必备技能。了解如何生成和配置SSL证书,以及启用HTTP/2协议提升性能。 ...

    nginx解决跨域问题的实例方法

    通过以上配置和测试,Nginx可以有效地帮助解决跨域问题,使前端能够顺利地与不同源的后端服务进行通信。在实际项目中,可能还需要考虑其他安全措施,如配置CORS(Cross-Origin Resource Sharing)头,允许特定的跨域...

    Nginx初中级操作手册

    总结来说,Nginx 作为一个多功能的Web服务器和反向代理,提供了广泛的功能和灵活性,适合搭建高性能、高可用性的Web环境。通过深入理解和实践这些操作手册中的知识点,可以更好地管理和优化 Nginx 服务。

    nginx 伪静态 重定向

    Nginx允许在`server`和`location`上下文中使用`if`条件判断,常见的条件包括正则表达式匹配、文件和目录的存在性检测等。 例如,针对特定用户代理(如IE浏览器)执行重定向: ```nginx if ($http_user_agent ~ ...

    Nginx的Rewrite规则与实例

    - `flag`: 可选标志,如`last`, `break`, `redirect`, `permanent`等。 例如,一个简单的重写规则可能看起来像这样: ```nginx rewrite ^/old/(.*)$ /new/$1 permanent; ``` 这条规则将所有以`/old/`开头的URL...

    Nginx关于Rewrite执行顺序详解.docx

    Nginx是一款高性能的HTTP和反向代理服务器,广泛用于网站的负载均衡和内容分发。在Nginx中,Rewrite模块是实现URL重写的重要工具,它允许我们根据预定义的规则对请求的URL进行转换,从而实现动态URL到静态URL的映射...

    Nginx 应用技术指南

    rewrite指令支持多种标记,如last、break等,用于控制重写规则的行为。 **5.2 正则表达式匹配** 使用正则表达式来匹配URL,并基于匹配结果执行相应的重写动作。 **5.3 文件及目录匹配** 可以针对特定的文件或目录...

    nginx rewrite规则

    与Apache的`mod_rewrite`模块相比,Nginx的`rewrite`规则在语法和工作方式上有所不同,这使得理解并熟练掌握Nginx的`rewrite`规则成为提升服务器配置能力的关键。 **1. Nginx与Apache的Rewrite规则对比** Apache的...

    thinkphp3.1.3升级php7及nginx配置伪静态.zip

    break; } } ``` 这段代码会让Nginx将所有未找到的静态资源请求转发到`index.php`,通过ThinkPHP的URL路由机制处理。 4. **加载配置**:保存`demo.conf`后,执行`nginx -t`检查配置文件是否有错误,无误后用`...

    Nginx关于location的匹配规则详解.docx

    - `rewrite`指令允许我们修改请求的URL,可以结合`break`、`last`、`redirect`、`permanent`等标志来控制流程。 - `break`:结束当前的`rewrite`规则链。 - `last`:跳出`rewrite`规则链,执行匹配到的`location`...

    实例讲解nginx的rewrite规则

    ### 实例讲解Nginx的...通过上述实例和解释,我们可以看到Nginx中的`rewrite`规则是非常强大且灵活的,它不仅可以用于简单的URL重写,还可以根据不同的条件进行复杂的逻辑处理,从而实现更加高效和安全的服务配置。

Global site tag (gtag.js) - Google Analytics