1. 程式人生 > >nginx中location的匹配規則

nginx中location的匹配規則

匹配方式兩種:

  • 字首匹配:就是從前面匹配,要求前面是一樣的
  • 正則匹配:就是匹配正則表示式

兩種特殊的字首匹配:

  • = 表明是精確匹配,停止任何後面的匹配
  • ^~ 若最長字首匹配含有前面這個字元,則終止後面的正則匹配

一般的匹配過程:

  • 先進行字首匹配,再進行正則匹配
  • 在每種匹配型別的內部,又是按照書寫的順序匹配
  • 在字首匹配中,尋找並記錄最長字首匹配(兩個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都比較了),23滿足,3是最長字首匹配,所以暫時匹配配置configuration C。 然後進行正則匹配,按照書寫的順序,進行順序為5的匹配,沒有匹配到,選擇之前的最長字首匹配, configuration C

uri是/images/1.gif

先進行字首匹配,則按照書寫的順序,進行順序為1234的匹配,在匹配完成後(1234都比較了),24滿足,4是最長字首匹配,所以暫時匹配配置configuration D。又因為標記了^~,所以不進行後面的正則匹配,匹配結束,configuration D

uri是/documents/1.jpg

先進行字首匹配,則按照書寫的順序,進行順序為1234的匹配,在匹配完成後,23滿足,3是最長字首匹配,所以暫時匹配配置configuration C。 然後進行正則匹配,按照書寫順序,進行順序為5的匹配,匹配成功,丟棄之前的匹配,選擇configuration E,並終止後面的正則匹配。