一、概述
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