Nginx配置文件的rewrite功能中break和last的差别

这是个很狗血的问题,网上无数人写,基本没看到有弄清楚的。

 

不说废话,直接切入主题。

 

举例说明,面对一个这样的server配置:

 

 

 

 

面对一个飞来的URI请求,Nginx的是这样来理解的:

 

/---------------------------下边是算法---------------------------/

 

amt = int[4]

for(i=1 to 4){

if(match[i].tag=='break')amt[i]=10;

else amt[i]=1;

}

 

while(还没有匹配过 OR 上一轮有匹配成功){

 

for i=1 to 4{

    if(amt[i]==-1)continue;

    if(url 匹配 match[i]){

        url = do_replace(replace[i]);

        amt[i]--;

    } else {

        amt[i]==-1

    }

    if(url 匹配 Loc[i]) 完成

    if(url 在硬盘物理存在) 完成

}

 

}

echo 错误404

 

/---------------------------上边是算法---------------------------/

 

没错,Y就是这么处理的。

 

大概95%的人没有看明白这个算法,好吧,我用文字表达一下要点:

 

1、Nginx对rewrite的执行是按照先后顺序循环执行,一轮一轮的匹配替换URL,直到找到匹配的LOCATION或者存在这个URL对应的文件。

 

2、一个rewite匹配规则一旦没有被匹配上,则会被踢出循环队列,永远不再匹配,不论是last还是break

 

3、对于last的规则,如果每次都被匹配,则会一直执行下去,直到满10次,例如 rewrite ^/(.*) /1234.html last 这种必然会被执行的规则

 

4、对于break规则,最多匹配两次,两次之后,被踢出队列。

 

好吧,总结一下,LAST和BREAK的区别就是,LAST是10,BREAK是2

 

在具体使用上,有一条原则:除非你非常清楚LAST和BREAK的原理,一律都用BREAK吧!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值