語法規則
location = /uri = 表示精確匹配某個uri
location ^~ /uri ^~ 表示精確的前綴匹配以uri開頭的請求,優先級在正則之前
location ~ uri ~ 表示區分大小寫的正則匹配,這裏的uri就是一個正則表達式
location ~* uri ~* 表示不區分大小寫的正則匹配,這裏的uri就是一個正則表達式
location /uri 不帶修飾符,表示精確的前綴匹配以uri開頭的請求,優先級在正則之後
location / 通用匹配,未匹配到其他location的請求都會走到這裏。
其實就相當於匹配以/開頭的請求,自然就能匹配全部
匹配順序優先級
當存在多個同級location時,表達式越精確,優先級越高
例如:匹配http://localhost/wapabcd 時,/wap 優先級高於/wa
當存在多個不同級location時,匹配的優先級如下:
1、 =(完全精確匹配)
2、 ^~(帶修飾符的前綴精確匹配)
3、 ~(區分大小寫的正則匹配)
4、 ~*(不區分大小寫的正則匹配)
5、 /uri(無修飾符的前綴精確匹配)
6、 /(通用匹配)
例子:
#rule1 ,精確匹配http://localhost/q/a.html
location = /q/a.html {
echo “rule ‘=’, /q/a.html”;
}
#rule2 ,匹配以q開始的請求,如:http://localhost/qwer、http://localhost/q/
#但無法匹配 http://localhost/q/a.html,因爲rule1優先級高於rule2,所以會被rule1截獲
location ^~ /q { abc
echo "rule '^~',start with /q";
}
#rule3 這裏功能和rule2相同,但是無法生效,因爲正則的優先級低於^~
location ~ ^/q.* {
echo "regular expression '~',start with /q";
}
#rule4 這裏匹配所有以.js/.css結尾的請求,如http://localhost/a/jquery.js,
#但無法匹配http://localhost/q/jquery.js,因爲rule2優先級高於rule4,所以會被rul2截獲
location ~ \.(js|css)$ {
echo "regular expression '~',end with .js/.css";
}
#rule5 這裏匹配不區分大小寫的以.js/,css結尾的請求,如http://localhost/a/jquery.JS
location ~* \.(js|css)$ {
echo "regular expression '~',end with .jpeg/.css";
}
#rule6 無修飾符地匹配以w開始的請求,如http://localhost/wert、http://localhost/w/
#但無法匹配 http://localhost/w/a.js,因爲rule4/5的優先級高於rule6
location /w {
echo "rule no modifier '/w',start with /w";
}
#rule7 無修飾符地匹配以wa開始的請求,如http://localhost/waert、http://localhost/wa/
#此時優先級高於rule6,因爲在修飾符相同的情況下,越精確則越優先
location /wa {
echo "rule no modifier '/wa',start with /wa";
}
#rule8 通用匹配,接受所有未被其他location捕獲的請求
#其實本質上是因爲所有請求都是以/開始的,所以能夠匹配所有請求
location / {
echo "rule '/', match all requests"
}