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

在使用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
, break
, 配置
, rewrite
, nginx配置
last
nginx rewrite break、nginx rewrite last、rewrite last break、nginx break last、nginx rewrite,以便于您获取更多的相关知识。

时间: 2024-07-31 19:54:28

Nginx配置的rewrite编写时last与break的区别分析_nginx的相关文章

nginx配置访问图片路径以及html静态页面的调取方法_nginx

给大家讲一个快速配置nginx访问图片地址,以及访问html静态页面的配置. 1.实验环境 首先随便某个路径下创建相应的目录.如图下 2.在里面放自定义的html或者图片. 3.nginx配置 user root; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events {

python使用in操作符时元组和数组的区别分析

  有时候要判断一个数是否在一个序列里面,这时就会用到in运算符来判断成员资格,如果条件为真时,就会返回true,条件为假时,返回一个flase.这样的运算符叫做布尔运算符,其真值叫做布尔值. 在python中可以使用in符号判断指定的元素是否存在于列表中,但我发现元组和数组存在区别,下面是详细实验结果. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 >>> 'jb51.net' in ['haotu.net','jb51.net'] True >>&

PHP中删除变量时unset()和null的区别分析_php技巧

第一种方法:$varname=null 第二种方法:unset($varname) 这两种方法都可以删除变量,但结果有些许的差别. 代码: 复制代码 代码如下: <?php $a = array( 'a' => 'a', 'b' => 'b' ); $b = array( 'a' => 'a', 'b' => 'b' ); $a['b'] = null; unset($b['b']); print('<pre>'); print_r($a); print('<

Nginx配置编写时支持逻辑运算与大小写字母转换的方法_nginx

逻辑运算nginx的配置中不支持if条件的逻辑与&& 逻辑或|| 运算 ,而且不支持if的嵌套语法,否则会报下面的错误:nginx: [emerg] invalid condition. 我们可以用变量的方式来间接实现. 要实现的语句: if ($arg_unitid = 42012 && $uri ~/thumb/){ echo "www.jb51.net"; } 如果按照这样来配置,就会报nginx: [emerg] invalid conditio

rewrite规则写法及nginx配置location总结

rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用. 例如http://seanlook.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写. 语法: rewrite regex replacement [flag]; 如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理. 1.location正则写法 一个示例: location =

WordPress与Drupal的Nginx配置rewrite重写规则示例_nginx

WordPress wordpress依然是目前是世界上最流行的博客系统,越来越多由wordpress搭建而成的网站在使用nginx服务器软件,这里就来分享一下WordPress的nginx重写规则:   server { listen 80; server_name www.jb51.net jb51.net; access_log /data/logs/nginx/www.jb51.net.access.log main; index index.html index.php; root /

CentOS6.5下Yii在Nginx下的rewrite配置

环境 系统版本:CentOS6.5 x86_64 Nginx版本:nginx 1.6 一.吐嘈 坑哇,自己在开始在apache上搭建的,一切测试正常,结果转移到nginx平台后,发现里面的链接点击全部提示404,第一反应是.htaccess规则没有正常加载,开始尝试自己改写规则,结果没成功,百度一下,果然有nginx平台下的yii rewrite规则,配置如下: 二.Nginx配置 1.在nginx.conf的server段里面添加以下代码: location / {  if (!-e $req

服务器-nginx配置thinkphp的rewrite

问题描述 nginx配置thinkphp的rewrite 以前web用apache的架设thinkphp的程序,但是转为nginx的服务器后,一直不能正常网站,就是规则重写的问题: apache的配置:RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSAPTL] RewriteRule ^/?([a-z

Ubuntu下Nginx配置ThinkPHP的Pathinfo和URl Rewrite模式_nginx

概述 在上一篇文章Nginx配置Thinkphp支持URL Rewrite中已经介绍了如何配置Nginx支持ThinkPHP的URL Rewrite,但是上文针对的是Centos平台,这次因为某些特殊的原因,服务器环境必须用ubuntu,本来以为和Cetons中一模一样,但是配置完了发现不能使用,所以就百度了一些文章. 配置方法TP官方解决方案 复制代码 代码如下: location ~ .php         {                 #原有代码