Nginx配置文件的rewrite功能中break和last的差别
2011-04-27 18:27
671 查看
这是个很狗血的问题,网上无数人写,基本没看到有弄清楚的。
不说废话,直接切入主题。
举例说明,面对一个这样的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吧!
不说废话,直接切入主题。
举例说明,面对一个这样的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配置的rewrite编写时last与break的区别详解
- Nginx配置的rewrite编写时last与break的区别分析
- Nginx中的rewrite指令(break,last,redirect,permanent)
- 怎样区别nginx中rewrite时break和last
- nginx中rewrite模块break和last原理详解
- nginx配置文件中的rewrite参数
- nginx rewrite中last和break的区别
- nginx 目录文件列表功能配置
- nginx中rewrite模块break和last原理详解
- Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
- Nginx中的rewrite指令(break,last,redirect,permanent)
- Nginx(五)-- 配置文件之Rewrite
- Nginx配置文件功能注释
- nginx的rewrite功能配置指令
- Nginx中的rewrite指令(break,last,redirect,permanent)
- nginx静态文件配置 rewrite规则语法 及配置案例讲解
- nginx配置中last与break的区别(原创)
- 关于Nginx配置文件及ReWriteUrl那点事~
- nginx中rewrite模块break和last原理详解
- nginx rewrite break last