nginx執行請求的工作原理之location匹配詳解

許錚的成長之路發表於2019-03-10

作為一名PHPer,配置nginx是我們必會的技能項之一。但是當使用者請求到達nginx之後,是如何匹配到對應的配置項的呢?

location語法規則

首先我們先了解下location的語法規則,location語法規則大致可以分為兩類

一類是指定URL地址:

location [ = | ~ | ~* | ^~ ] uri {
	... 
}
複製程式碼

另一類則是指定自定義名稱:

location @name { 
	... 
}
複製程式碼

@name是對location設定的一個自定義名稱,由@+自定義命名組成,一般用於try_files後面的內部請求,且自定義命名location中不可再巢狀自定義命名location

舉例:

location @xuzheng{
	...
}
複製程式碼

location修飾符含義

上文我們提到location語法規則有一類是指定URL地址,其中運用了一些修飾符,下面我們看下這些修飾符的含義

1、 = 表示精確匹配。只有請求的url路徑與後面的字串完全相等時,才會命中。

舉例:

location = / {
	...
}
複製程式碼

2、 ~ 表示該規則是使用正則定義的,區分大小寫。

舉例:

location ~ \.php$ {
	...
}
複製程式碼

3、 ~* 表示該規則是使用正則定義的,不區分大小寫。

舉例:

location ~* \.php$ {
	...
}
複製程式碼

4、^~ 是字首匹配的一種,但是如果該符號後面的字元被匹配上,則被預設為最佳匹配,即採用該規則,不再進行後續的查詢。

舉例:

location ^~ /blogs {
	...
}
複製程式碼

location匹配優先順序

最後,我們瞭解下location的查詢規則。下面列出的location查詢,從上到下的優先順序為從高到低

1、等號型別,精確匹配
2、^~型別,字首匹配,不支援正則,如果該符號後面的字元匹配被匹配上,則被預設為最佳匹配,不再繼續往下查詢
3、~~*型別,正則匹配,~區分大小寫,~*不區分大小寫
4、字首匹配型別,如location / {}(表示任何以/開頭的URL都匹配)或location /user {},只不過找到合適了還會繼續往下找,直到找到最長匹配
注:使用正則匹配的規則時,順序很重要,location只要找到第一個符合條件的配置規則就會停止查詢,即使下面有更匹配的配置

總結

location匹配過程:
1、首先先檢查使用字首匹配(即字串匹配)定義的location,選擇最長匹配的項並記錄下來
2、如果找到了精確匹配的location,也就是使用了=修飾符的location,結束查詢,使用它的配置。如果沒有找到合適精確匹配,則繼續往下查詢
3、如果找到了包含^~的字首匹配,則停止查詢,使用它定義的配置。如果沒有找到合適的帶^~符號的字首匹配,則繼續往下查詢
4、如果找到了使用正則定義的location,則停止查詢,使用它定義的配置。如果沒有找到合適的正則匹配,則繼續往下查詢
5、使用前面記錄的最長匹配字首字元location。

相關文章