OP首选一个例子。另外,@ minaev写的只是故事的一部分!所以,我们开始...
示例1:无(中断或最后一个)标志
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
}
location /notes {
echo 'finally matched location /notes';
}
location /documents {
echo 'finally matched location /documents';
}
rewrite ^/([^/]+.txt)$ /notes/$1;
rewrite ^/notes/([^/]+.txt)$ /documents/$1;
}
结果:
# curl example.com/test.txt
finally matched location /documents
说明:
对于rewrite
,标志是可选的!
示例2:外部位置块(中断或最后一个)
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
}
location /notes {
echo 'finally matched location /notes';
}
location /documents {
echo 'finally matched location /documents';
}
rewrite ^/([^/]+.txt)$ /notes/$1 break; # or last
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}
结果:
# curl example.com/test.txt
finally matched location /notes
说明:
外面的位置块,都break
和last
在精确的方式表现...
- 不再解析重写条件
- Nginx内部引擎进入下一阶段(搜索
location
匹配项)
示例3:内部位置信息块-“中断”
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
rewrite ^/([^/]+.txt)$ /notes/$1 break;
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}
location /notes {
echo 'finally matched location /notes';
}
location /documents {
echo 'finally matched location /documents';
}
}
结果:
# curl example.com/test.txt
finally matched location /
说明:
在位置块内,break
flag将执行以下操作...
- 不再解析重写条件
- Nginx内部引擎继续解析当前
location
块
示例4:内部位置块-“最后一个”
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
rewrite ^/([^/]+.txt)$ /notes/$1 last;
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}
location /notes {
echo 'finally matched location /notes';
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed, either!
}
location /documents {
echo 'finally matched location /documents';
}
}
结果:
# curl example.com/test.txt
finally matched location /notes
说明:
在位置块内,last
flag将执行以下操作...
- 不再解析重写条件
- Nginx内部引擎开始根据结果结果寻找另一个位置匹配项
rewrite
。
- 不再分析重写条件,即使在下一个位置匹配时也是如此!
摘要:
- 当
rewrite
带有标志break
或last
匹配的条件时,Nginx停止解析rewrites
!
- 在位置块之外,使用
break
或last
,Nginx会执行相同的工作(不再处理重写条件)。
- 在一个位置块中,使用
break
,Nginx仅停止处理重写条件
- 在带有的位置块内
last
,Nginx不再处理重写条件,然后开始寻找与该location
块的新匹配!Nginx也会忽略rewrites
新location
块中的任何内容!
最后说明:
我错过了包含更多边缘情况(实际上是重写常见的问题,例如500 internal error
)。但是,这超出了这个问题的范围。示例1可能也超出范围!