break和last的区别
last
停止当前这个URL匹配,使用rewrite后的URL,重新发起一个新的匹配,原浏览器URL不会跳转break
相对last,break并不会使用新的 URL 重新匹配,只是跳出 break 所在的代码段,并执行location后续操作,原浏览器URL不会跳转redirect
返回302临时重定向,浏览器地址会显示跳转后的URL地址permanent
返回301永久重定向,浏览器地址栏显示跳转后的URL地址,Nginx返回response状态码301
例子说明和总结
代码一, break
location ~ /imgs/(.+\.(jpg|jpeg|png|bmp))$ {
# 文件不存在先下载
if (!-f $filename) {
rewrite .* /cdn.php break;
return 500;
}
return 501;
}
location / {
return 502;
}
分析:(假设访问的链接是 /imgs/abc.jpg
)
- 遇到 rewrite 规则,新的 url 变成
/cdn.php
,但是浏览器不跳转还是/imgs/abc.jpg
; - break 会跳出同级代码段,即
if
里面的代码段,所以return 500;
不会执行; - 跳出之后,按
/cdn.php
的规则,继续执行到return 501;
- 最后会显示页面
501
代码二, last
location ~ /imgs/(.+\.(jpg|jpeg|png|bmp))$ {
# 文件不存在先下载
if (!-f $filename) {
rewrite .* /cdn.php last;
return 500;
}
return 501;
}
location / {
return 502;
}
分析:
- 遇到 rewrite 规则,新的 url 变成
/cdn.php
,但是浏览器不跳转还是/imgs/abc.jpg
; - last 会按新 url
/cdn.php
重头开始匹配,所以return 500;
不会执行,同样后面的return 501;
也就执行不了; - 这时,新的 url
/cdn.php
自然匹配不了/imgs
,所以只会最终匹配到/
规则,执行到return 502;
- 最后会显示页面
502