nginx的location匹配規則,泣血總結
location語法
location [=|~|~*|^~] /uri/ { … }
= 開頭表示精確匹配
^~ 開頭表示uri以某個常規字串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規則^~ /static/ /aa匹配到(注意是空格)。
~ 開頭表示區分大小寫的正則匹配
~* 開頭表示不區分大小寫的正則匹配
!~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配 的正則
/ 通用匹配,任何請求都會匹配到。
1、精準匹配和一般匹配
如圖:
請求URL:http://192.168.60.106/zg
2、精準匹配和一般匹配,uri後面不帶“/”匹配
如圖:
請求URL:http://192.168.60.106/zg/ 訪問時匹配的是:/zg
3、精準匹配和一般匹配,uri前面和後面都不帶“/”
如圖:
請求URL:http://192.168.60.106/zg/ 訪問時匹配的是:= zg
4、精準匹配和一般匹配,uri帶"/"和不帶"/"匹配
如圖:
請求URL:http://192.168.60.106/zg/ 訪問時匹配的是:/zg/ 順序換也是一樣
綜上所述:路徑相同時的精準匹配優先,必須是滿足
5、一般匹配時的匹配規則
如圖:
在html下建立file,lfile資料夾,然後在file下建立images資料夾,在images下建立aa資料夾,在lfile下建立images資料夾,接著在images下建立aa資料夾,然後同時在兩個aa資料夾下匯入test.jpg圖片,這樣file和lfile下都有images/aa路徑
請求url:http://192.168.60.106/images/aa/test.jpg,既能匹配/images/,又能匹配/images/aa,這時以最長uri匹配優先,匹配的是:/images/aa
6、^~開頭的非正則匹配和一般匹配
^~代表非正則匹配,非正則,不需要繼續正則匹配。
如圖:
^~:如果這個匹配使用^〜字首,搜尋停止。這個字首官網和網上都說得很含糊,加上這個字首,是會停止搜尋正則匹配,但是對一般匹配是不會停止的,也就是說還是可以匹配到一般匹配的。
請求url: http://192.168.60.106/images/aa/test.jpg,匹配結果:/images/aa/
7、^~開頭的非正則匹配和正則匹配
~ 開頭表示區分大小寫的正則匹配
如圖:
請求url: http://192.168.60.106/images/aa/test.jpg,匹配結果:^~/images/
8、嚴格精準匹配和正則匹配
如圖:
嚴格精準匹配,如果被嚴格精準匹配到了,則不會繼續搜尋正則匹配
如果http://192.168.60.106,這個就嚴格精準匹配到了 /,則不會繼續匹配 ~ \.html$
如果:http://192.168.60.106/index.html,則會被/ 匹配到,但是不是嚴格精準匹配,則會繼續搜尋正則匹配
9、正則匹配規則
都是正則uri的情況下,匹配是按照編輯順序的
如圖:
請求URL:http://192.168.60.106/prefix/index.html,會優先匹配前面定義的location。
10、@開頭的uri
如圖:
@開頭的,如果請求的 URI 存在,則本 nginx 返回對應的頁面;如果不存在,則把請求代理到baidu.com 上去做個彌補,其實就是做了一個容錯,把找不到的url全部轉發到fallback的反向代理伺服器去。
最後總結:
1. 先判斷精準命中,如果命中,立即返回結果並結束解析過程
2. 判斷普通命中,如果有多個命中,記錄下來最長的命中結果
3、如果是^~開頭的命中,則不會繼續搜尋正則命中,但是會繼續搜尋一般命中
4. 繼續判斷正則表示式的解析結果,按配置裡的正則表示式順序為準,由上到下開始匹配,一旦匹配成功立刻返回結果,並結束解析過程。
延伸分析:a. 普通命中:順序無所謂,是因為按命中長短來確定的 b. 正則命中:順序有所謂,因為是從前往後命中的
以上結果都是樓主親測有效的,如有不對,歡迎大家糾正!,希望能幫到大家~~~