nginx location匹配規(guī)則

一、概述

nginx官方文檔給出location語法如下:

1location?[=|~|~*|^~]?uri?{?…?}

其中,方括號(hào)中的四種標(biāo)識(shí)符是可選項(xiàng),用來改變請(qǐng)求字符串和uri的匹配方式。uri是待匹配的請(qǐng)求字符串,可以是不包含正則的字符串,這種模式被稱為“標(biāo)準(zhǔn)的uri";也可以包含正則,這種模式被稱為"正則uri",如下:

location?~?.*\.(php|php5)?$?{

}

二、四種可選的標(biāo)識(shí)符

標(biāo)識(shí)符描述

=精確匹配;用于標(biāo)準(zhǔn)uri前,要求請(qǐng)求字符串和uri嚴(yán)格匹配。如果匹配成功,就停止匹配,立即執(zhí)行該location里面的請(qǐng)求。

~正則匹配;用于正則uri前,表示uri里面包含正則,并且區(qū)分大小寫。

~*正則匹配;用于正則uri前,表示uri里面包含正則,不區(qū)分大小寫。

^~非正則匹配;用于標(biāo)準(zhǔn)uri前,nginx服務(wù)器匹配到前綴最多的uri后就結(jié)束,該模式匹配成功后,不會(huì)使用正則匹配。

普通匹配(最長字符匹配);與location順序無關(guān),是按照匹配的長短來取匹配結(jié)果。若完全匹配,就停止匹配。

備注

1、如果uri里面包含正則表達(dá)式,就必須使用~或~*標(biāo)識(shí)符;

2、針對(duì)~和~*匹配標(biāo)識(shí)符,可以在前面加上!來取反,如下:

!~表示正則不匹配,區(qū)分大小寫。

!~*表示正則不匹配,不區(qū)分大小寫。

2.1 “=”精準(zhǔn)匹配案例

location??=?/login?{

??#?精確匹配?/login?,匹配成功后,立即結(jié)束

}

2.2 “~”區(qū)分大小寫正則匹配案例

location?~?/images/?{

??#正則匹配,區(qū)分大小寫,匹配成功后,立即結(jié)束

}

2.3 “~*”不區(qū)分大小寫正則匹配案例

location?~*?/images/?{

??#正則匹配,不區(qū)分大小寫,匹配成功后,立即結(jié)束

}

2.4 “^~” 不進(jìn)行正則匹配的標(biāo)準(zhǔn)匹配

location?^~?/images/?{

??#?匹配任何以?/images/?開頭的地址,匹配符合以后,停止往下搜索正則,采用這一條。

}

2.5 普通匹配(最長字符匹配)

location??/blog/?{

??#?與location順序無關(guān)

??#?若完全匹配成功,就不在繼續(xù)匹配,否則還會(huì)進(jìn)行正則匹配

}

三、location匹配順序

在沒有標(biāo)識(shí)符的請(qǐng)求下,匹配規(guī)則如下:

1、nginx服務(wù)器首先在server塊的多個(gè)location塊中搜索是否有標(biāo)準(zhǔn)的uri和請(qǐng)求字符串匹配。如果有多個(gè)標(biāo)準(zhǔn)uri可以匹配,就匹配其中匹配度最高的一個(gè)location。

2、然后,nginx在使用location塊中,正則uri和請(qǐng)求字符串,進(jìn)行匹配。如果正則匹配成功,則結(jié)束匹配,并使用這個(gè)location處理請(qǐng)求;如果正則匹配失敗,則使用標(biāo)準(zhǔn)uri中,匹配度最高的location。

備注:

1、如果有精確匹配,會(huì)先進(jìn)行精確匹配,匹配成功,立刻返回結(jié)果。

2、普通匹配與順序無關(guān),因?yàn)榘凑掌ヅ涞拈L短來取匹配結(jié)果。

3、正則匹配與順序有關(guān),因?yàn)槭菑纳贤缕ヅ洹?首先匹配,就結(jié)束解析過程)

4、在location中,有一種統(tǒng)配的location,所有的請(qǐng)求,都可以匹配,如下:

location??/?{

??#?因?yàn)樗械牡刂范家?/?開頭,所以這條規(guī)則將匹配到所有請(qǐng)求

??#?但是正則和最長字符串會(huì)優(yōu)先匹配

}

結(jié)合標(biāo)識(shí)符,匹配順序如下:

(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (location /)

(精確匹配)> (最長字符串匹配,但完全匹配) >(非正則匹配)>(正則匹配)>(最長字符串匹配,不完全匹配)>(location通配)

五、案例

假設(shè),現(xiàn)有如下一些規(guī)則:

location?=?/?{??

???//精確匹配/?,主機(jī)名后面不能帶任何字符串

????echo"規(guī)則A";

}


location?=?/login?{

??//精確匹配?/login?開頭的地址,匹配符合以后,不在繼續(xù)往下搜索?

????echo"規(guī)則B";

}


location?^~?/blog/?{?

??//非正則匹配,匹配/blog/后,停止往下搜索正則,采用這一條

??echo"規(guī)則C";

}



location?~??\.(gif|jpg|png|js|css)$?{

????//區(qū)分大小寫的正則匹配??若匹配成功,停止往下搜索正則,采用這一條

????echo"規(guī)則D";

}



location?~*?\.png$?{??

???//區(qū)分大小寫的正則匹配?,停止往下搜索正則,采用這一條

????echo"規(guī)則E";

}


location?/?{

??//因?yàn)樗械牡刂范家?/?開頭,所以這條規(guī)則將匹配到所有請(qǐng)求

??//如果沒任何規(guī)則匹配上,就采用這條規(guī)則

????echo"規(guī)則F";

}


location?/blog/detail?{?

??//最長字符串匹配,若完全匹配成功,就不在繼續(xù)匹配,否則還會(huì)進(jìn)行正則匹配

??echo"規(guī)則G";

}


location?/images?{??

????//最長字符串匹配,同上?

????echo"規(guī)則Y";

}


location?^~?/static/files?{??

????//非正則匹配,若匹配成功,就不在繼續(xù)匹配

????echo"規(guī)則X";

}

1、當(dāng)訪問根路徑/的時(shí)候,比如http://www.findme.wang/,會(huì)匹配規(guī)則A。

2、當(dāng)訪如http://www.findme.wang/login,會(huì)匹配規(guī)則B。

3、當(dāng)訪如http://www.findme.wang/login.html,會(huì)匹配規(guī)則F。

4、當(dāng)訪如http://www.findme.wang/blog/detail/3.html,會(huì)匹配規(guī)則C。分析思路,首先看看,“精確匹配”是否可以匹配成功,顯示不可以;然后,看看是否可以“普通匹配”是否可以完全匹配,顯示也沒有;接著在看看非正則匹配,是否可以匹配成功,發(fā)現(xiàn)同規(guī)則C匹配上了,所以采用了規(guī)則C。


http://www.findme.wang/blog/detail/id/495.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容