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