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

 更新时间:2016年01月06日 17:22:40   作者:moon  
这篇文章主要介绍了Nginx配置的rewrite编写时last与break的区别分析,简单来说使用last会对server标签重新发起请求,而break就直接使用当前的location中的数据源来访问,需要的朋友可以参考下

在使用nginx配置rewrite中经常会遇到有的地方用last并不能工作,换成break就可以,其中的原理是对于根目录的理解有所区别,按我的测试结果大致是这样的。

location /  
{  
  proxy_pass http://test;  
  alias /home/html/;  
  root /home/html;  
  rewrite "^/a/(.*)\.html$" /1.html last;  
} 

在location / { 配置里:
1、使用root指定源:使用last和break都可以
2、使用proxy_pass指定源:使用last和break都可以
3、使用alias指定源:必须使用last
在location /a/或使用正则的location ~ ^/a/里:
1、使用root指定源:使用last和break都可以
2、使用proxy_pass指定源:使用break和last结果有所区别
3、使用alias指定源:必须使用last
其中区别主要在proxy_pass这个标签上,再看看几个测试结果:

location /  
{  
  root /home/html;  
}  
 
location /a/  
{  
  proxy_pass http://test;  
  rewrite "^/a/(.*)\.html$" /1.html last;  
} 

在这段配置里,使用last访问是可以访问到东西的,不过,它出来的结果是:/home/html/1.html;可我需要的是http://test/1.html?使用break就可以了。

location /  
{  
  root /home/html;  
}  
  
location /a/  
{  
  proxy_pass http://test;  
  rewrite "^/a/(.*)\.html$" /a/1.html last;  
} 

在这段配置里,返回错误,因为last会重新发起请求匹配,所以造成了一个死循环,使用break就可以访问到http://test/a/1.html。
所以,使用last会对server标签重新发起请求,而break就直接使用当前的location中的数据源来访问,要视情况加以使用。一般在非根的location中配置rewrite,都是用的break;而根的location使用last比较好,因为如果配置了fastcgi或代理访问jsp文件的话,在根location下用break是访问不到。测试到rewrite有问题的时候,也不妨把这两者换换试试。
至于使用alias时为什么必须用last,估计是nginx本身就限定了的,怎么尝试break都不能成功。

所以我们再来理解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的错误。

您可能感兴趣的文章:

相关文章

  • 详解nginx中的日志配置

    详解nginx中的日志配置

    日志对于统计排错来说非常有利的,本文为大家总结了nginx日志相关的配置如access_log、log_format、open_log_file_cache等内容,感兴趣的小伙伴可以了解下
    2023-08-08
  • Nginx中accept锁的机制与实现详解

    Nginx中accept锁的机制与实现详解

    这篇文章主要给大家介绍了关于Nginx中accept锁的机制与实现的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Windows 安装 nginx 部署教程

    Windows 安装 nginx 部署教程

    这篇文章主要介绍了Windows安装nginx部署,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Nginx配置检测服务状态的实现方法

    Nginx配置检测服务状态的实现方法

    这篇文章主要介绍了Nginx配置检测服务状态的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Nginx配置同一个域名同时支持http与https两种方式访问实现

    Nginx配置同一个域名同时支持http与https两种方式访问实现

    这篇文章主要介绍了Nginx配置同一个域名同时支持http与https两种方式访问实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • uwsgi+nginx代理Django无法访问静态资源的解决

    uwsgi+nginx代理Django无法访问静态资源的解决

    这篇文章主要介绍了uwsgi+nginx代理Django无法访问静态资源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Nginx处理请求时的匹配规则详析

    Nginx处理请求时的匹配规则详析

    这篇文章主要给大家介绍了关于Nginx处理请求时的匹配规则的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Nginx具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • 基于Nginx 反向代理获取真实IP的问题详解

    基于Nginx 反向代理获取真实IP的问题详解

    下面小编就为大家分享一篇基于Nginx 反向代理获取真实IP的问题详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Nginx SSI指令配置详解

    Nginx SSI指令配置详解

    这篇文章主要介绍了Nginx SSI指令配置详解,本文讲解了什么是SSI、为什么要用SSI、nginx配置SSI、页面上配置、配置示例等内容,需要的朋友可以参考下
    2015-04-04
  • nginx使用内置模块配置限速限流的方法实例

    nginx使用内置模块配置限速限流的方法实例

    Nginx现在已经是最火的负载均衡之一,在流量陡增的互联网面前,接口限流也是很有必要的,尤其是针对高并发的场景,下面这篇文章主要给大家介绍了关于nginx使用内置模块配置限速限流的相关资料,需要的朋友可以参考下
    2022-05-05

最新评论