/ 中存储网

Nginx服务器配置的rewrite语句中break和last的区别

2013-12-25 14:51:01 来源:IT技术网

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

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

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

server {

listen       80;

server_name  www.server110.com;

root         /var/www/server110;

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吧!