最近一直在做location 配置,遇到優(yōu)先級別問題(如果配置不當(dāng)可能存在安全隱患哦),以下是個人學(xué)習(xí)一點體會。
一、 location 的匹配符
1.等于匹配符:=
等于匹配符就是等號,特點可以概括為兩點:
精確匹配
不支持正則表達(dá)式
2.空匹配符
空匹配符的特點是:
匹配以指定模式開始的 URI
不支持正則表達(dá)式
3.正則匹配符:~
正則匹配符是可以使用正則表達(dá)式的匹配符。不過這里要強調(diào)的是,一般來說~是指:
區(qū)分大小寫的正則匹配
而~*表示:
不區(qū)分大小寫的正則匹配
但是對于一些對大小寫不敏感的操作系統(tǒng),這兩者沒有區(qū)別。另外一個就是^~,其表示以指定模式開始的正則匹配。
4.內(nèi)部訪問符:@
一般用于錯誤頁面等,這個暫不討論。
二、匹配符優(yōu)先級
1.=
2.空匹配符,滿足精確匹配時
3.^~
4.~或~*
5.空匹配符,滿足以指定模式開始時的匹配時
這樣說比較抽象,我們來看例子吧。
2.1 等于匹配符與精確匹配時的空匹配符
看下面的例子(用到我們此前一起完成的Hello World模塊):
復(fù)制代碼 代碼如下:
location /poechant {
hello_world no1;
}
location = /poechant {
hello_world no2;
}
如果我們的請求是http://my.domian/poechant,則我們發(fā)現(xiàn)兩個location都與請求的 URI 匹配,這時根據(jù)我們的優(yōu)先級順序,第一個是精確匹配時的空匹配符,第二個是等于匹配符,所以第二個的優(yōu)先級高,也就是應(yīng)該輸出:
hello_world, no2
同時也說明 Nginx 的 locatoin 不是按照配置文件中的書寫順序來匹配的。
2.2 精確匹配時的空匹配符與正則匹配的^~
下面這個例子中,兩者開始都精確匹配了,連這個正則匹配都是精確匹配。
復(fù)制代碼 代碼如下:
location ^~ ^/poechant$ {
hello_world no1;
}
location /poechant {
hello_world no2;
}
匹配哪一個?你測試一下,會得到:
hello_world, no2
與我們上面說的優(yōu)先級順序相吻合。
2.3 其他匹配優(yōu)先級比較的實例
略
三、實戰(zhàn)經(jīng)驗總結(jié)
1.location 匹配的優(yōu)先級(來自實踐總結(jié)中)
(location =) > (location 完整路徑 >) >(location ^~ 路徑) >(location ~* 正則) >(location 路徑)
只要匹配到,其它的都會忽略,然后返回到改匹配。
用以下例子來測試:
復(fù)制代碼 代碼如下:
#1
location / {
return 500;
}
#2
location /a/ {
return 404;
}
#3
location ~* /.jpg$ {
return 403;
}
#4
location ^~ /a/ {
return 402;
}
#5
location /a/1.jpg {
return 401;
}
#6
location = /a/1.jpg {
return 400;
}
說明:測試的時候,先要將#2全部注釋掉,不然會認(rèn)為#2 與#4 完全一樣。會提示:重復(fù)配置,提示如下
復(fù)制代碼
新聞熱點
疑難解答
圖片精選