您的位置:首页 > 运维架构 > Nginx

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

2011-04-27 18:27 671 查看
这是个很狗血的问题,网上无数人写,基本没看到有弄清楚的。

 

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

 

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

 

 

server {
listen       80;
server_name  www.shermy.com;
root         /var/www/shermy;
index        index.php index.html index.htm;

location [loc-1] {
/**此处略去1000字**/
}

location [loc-2] {
/**此处略去1000字**/
}

rewrite [match-1] [replace-1] break;
rewrite [match-2] [replace-2] last;
rewrite [match-3] [replace-3] last;
rewrite [match-4] [replace-4] break;

}


 

 

面对一个飞来的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吧!

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nginx url server 算法