nginx中location的匹配規則
阿新 • • 發佈:2018-12-11
匹配方式兩種:
- 字首匹配:就是從前面匹配,要求前面是一樣的
- 正則匹配:就是匹配正則表示式
兩種特殊的字首匹配:
- = 表明是精確匹配,停止任何後面的匹配
- ^~ 若最長字首匹配含有前面這個字元,則終止後面的正則匹配
一般的匹配過程:
- 先進行字首匹配,再進行正則匹配
- 在每種匹配型別的內部,又是按照書寫的順序匹配
- 在字首匹配中,尋找並記錄最長字首匹配(兩個location,
/abc
和/abc/def
那麼帶uri/abc/def/a.jpg
的請求匹配的最長字首就是/abc/def
) - 在正則匹配中,
~
和~*
區分大小寫和不區分大小寫。匹配到就終止後面的正則匹配,並捨棄之前最長字首匹配。若是正則部分沒有匹配到,那麼就選擇之前的最長字首匹配。
其他說明:
- 在匹配過程中要注意兩種特殊的字首匹配,所以上面說的是一般的匹配過程
- 當訪問
http://localhost
時和訪問http://localhost/
是一樣的,uri是\ - 匹配結果可以是任何location都沒有匹配到的,沒有什麼預設location的概念
下面通過例子說明:
location = / { 1 [ configuration A ] } location / { 2 [ configuration B ] } location /documents/ { 3 [ configuration C ] } location ^~ /images/ { 4 [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { 5 [ configuration E ] }
uri是/
:
先進行字首匹配,按照書寫的順序,進行順序為1234
的匹配。匹配到1
時,因為滿足且是精確匹配,終止匹配,configuration A
。
uri是/index.html
:
先進行字首匹配,則按照書寫的順序,進行順序為1234
的匹配,在匹配完成後(1234
都比較了),2
滿足,2
是最長字首匹配(並不是都沒匹配到,匹配到“預設”的/這個邏輯,location沒有預設的概念)。
然後進行正則匹配,按照書寫的順序,進行順序為5
的匹配,沒有匹配到,選擇之前的最長字首匹配, configuration B
。
uri是/documents/document.html
:
先進行字首匹配,則按照書寫的順序,進行順序為1234
1234
都比較了),2
和3
滿足,3
是最長字首匹配,所以暫時匹配配置configuration C。
然後進行正則匹配,按照書寫的順序,進行順序為5的匹配,沒有匹配到,選擇之前的最長字首匹配, configuration C
。
uri是/images/1.gif
:
先進行字首匹配,則按照書寫的順序,進行順序為1234
的匹配,在匹配完成後(1234
都比較了),2
和4
滿足,4
是最長字首匹配,所以暫時匹配配置configuration D。又因為標記了^~
,所以不進行後面的正則匹配,匹配結束,configuration D
。
uri是/documents/1.jpg
:
先進行字首匹配,則按照書寫的順序,進行順序為1234
的匹配,在匹配完成後,2
和3
滿足,3
是最長字首匹配,所以暫時匹配配置configuration C
。
然後進行正則匹配,按照書寫順序,進行順序為5
的匹配,匹配成功,丟棄之前的匹配,選擇configuration E
,並終止後面的正則匹配。