Nginx配置的rewrite編寫(xiě)時(shí)last與break的區(qū)別分析
在使用nginx配置rewrite中經(jīng)常會(huì)遇到有的地方用last并不能工作,換成break就可以,其中的原理是對(duì)于根目錄的理解有所區(qū)別,按我的測(cè)試結(jié)果大致是這樣的。
location /
{
proxy_pass http://test;
alias /home/html/;
root /home/html;
rewrite "^/a/(.*)\.html$" /1.html last;
}
在location / { 配置里:
1、使用root指定源:使用last和break都可以
2、使用proxy_pass指定源:使用last和break都可以
3、使用alias指定源:必須使用last
在location /a/或使用正則的location ~ ^/a/里:
1、使用root指定源:使用last和break都可以
2、使用proxy_pass指定源:使用break和last結(jié)果有所區(qū)別
3、使用alias指定源:必須使用last
其中區(qū)別主要在proxy_pass這個(gè)標(biāo)簽上,再看看幾個(gè)測(cè)試結(jié)果:
location /
{
root /home/html;
}
location /a/
{
proxy_pass http://test;
rewrite "^/a/(.*)\.html$" /1.html last;
}
在這段配置里,使用last訪問(wèn)是可以訪問(wèn)到東西的,不過(guò),它出來(lái)的結(jié)果是:/home/html/1.html;可我需要的是http://test/1.html?使用break就可以了。
location /
{
root /home/html;
}
location /a/
{
proxy_pass http://test;
rewrite "^/a/(.*)\.html$" /a/1.html last;
}
在這段配置里,返回錯(cuò)誤,因?yàn)閘ast會(huì)重新發(fā)起請(qǐng)求匹配,所以造成了一個(gè)死循環(huán),使用break就可以訪問(wèn)到http://test/a/1.html。
所以,使用last會(huì)對(duì)server標(biāo)簽重新發(fā)起請(qǐng)求,而break就直接使用當(dāng)前的location中的數(shù)據(jù)源來(lái)訪問(wèn),要視情況加以使用。一般在非根的location中配置rewrite,都是用的break;而根的location使用last比較好,因?yàn)槿绻渲昧薴astcgi或代理訪問(wèn)jsp文件的話,在根location下用break是訪問(wèn)不到。測(cè)試到rewrite有問(wèn)題的時(shí)候,也不妨把這兩者換換試試。
至于使用alias時(shí)為什么必須用last,估計(jì)是nginx本身就限定了的,怎么嘗試break都不能成功。
所以我們?cè)賮?lái)理解last與break的區(qū)別:
last: 停止當(dāng)前這個(gè)請(qǐng)求,并根據(jù)rewrite匹配的規(guī)則重新發(fā)起一個(gè)請(qǐng)求。新請(qǐng)求又從第一階段開(kāi)始執(zhí)行…
break:相對(duì)last,break并不會(huì)重新發(fā)起一個(gè)請(qǐng)求,只是跳過(guò)當(dāng)前的rewrite階段,并執(zhí)行本請(qǐng)求后續(xù)的執(zhí)行階段…
我們?cè)賮?lái)看一個(gè)例子:
server {
listen 80 default_server;
server_name dcshi.com;
root www;
location /break/ {
rewrite ^/break/(.*) /test/$1 break;
echo "break page";
}
location /last/ {
rewrite ^/last/(.*) /test/$1 last;
echo "last page";
}
location /test/ {
echo "test page";
}
}
請(qǐng)求:http://dcshi.com/break/***
輸出: break page
分析:正如上面討論所說(shuō),break是跳過(guò)當(dāng)前請(qǐng)求的rewrite階段,并繼續(xù)執(zhí)行本請(qǐng)求的其他階段,很明顯,對(duì)于/foo 對(duì)應(yīng)的content階段的輸出為 echo “break page”; (content階段,可以簡(jiǎn)單理解為產(chǎn)生數(shù)據(jù)輸出的階段,如返回靜態(tài)頁(yè)面內(nèi)容也是在content階段;echo指令也是運(yùn)行在content階段,一般情況下content階段只能對(duì)應(yīng)一個(gè)輸出指令,如同一個(gè)location配置兩個(gè)echo,最終只會(huì)有一個(gè)echo指令被執(zhí)行);當(dāng)然如果你把/break/里的echo 指令注釋,然后再次訪問(wèn)/break/xx會(huì)報(bào)404,這也跟我們預(yù)期一樣:雖然/break/xx被重定向到/test/xx,但是break指令不會(huì)重新開(kāi)啟一個(gè)新的請(qǐng)求繼續(xù)匹配,所以nginx是不會(huì)匹配到下面的/test/這個(gè)location;在echo指令被注釋的情況下,/break/ 這location里只能執(zhí)行nginx默認(rèn)的content指令,即嘗試找/test/xx這個(gè)html頁(yè)面并輸出起內(nèi)容,事實(shí)上,這個(gè)頁(yè)面不存在,所以會(huì)報(bào)404的錯(cuò)誤。
相關(guān)文章
Nginx中accept鎖的機(jī)制與實(shí)現(xiàn)詳解
這篇文章主要給大家介紹了關(guān)于Nginx中accept鎖的機(jī)制與實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
Nginx配置檢測(cè)服務(wù)狀態(tài)的實(shí)現(xiàn)方法
這篇文章主要介紹了Nginx配置檢測(cè)服務(wù)狀態(tài)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Nginx配置同一個(gè)域名同時(shí)支持http與https兩種方式訪問(wèn)實(shí)現(xiàn)
這篇文章主要介紹了Nginx配置同一個(gè)域名同時(shí)支持http與https兩種方式訪問(wèn)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
uwsgi+nginx代理Django無(wú)法訪問(wèn)靜態(tài)資源的解決
這篇文章主要介紹了uwsgi+nginx代理Django無(wú)法訪問(wèn)靜態(tài)資源,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Nginx處理請(qǐng)求時(shí)的匹配規(guī)則詳析
這篇文章主要給大家介紹了關(guān)于Nginx處理請(qǐng)求時(shí)的匹配規(guī)則的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Nginx具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
基于Nginx 反向代理獲取真實(shí)IP的問(wèn)題詳解
下面小編就為大家分享一篇基于Nginx 反向代理獲取真實(shí)IP的問(wèn)題詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
nginx使用內(nèi)置模塊配置限速限流的方法實(shí)例
Nginx現(xiàn)在已經(jīng)是最火的負(fù)載均衡之一,在流量陡增的互聯(lián)網(wǎng)面前,接口限流也是很有必要的,尤其是針對(duì)高并發(fā)的場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于nginx使用內(nèi)置模塊配置限速限流的相關(guān)資料,需要的朋友可以參考下2022-05-05

