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

做爲一名PHPer,配置nginx是咱們必會的技能項之一。可是當用戶請求到達nginx以後,是如何匹配到對應的配置項的呢?php

location語法規則

首先咱們先了解下location的語法規則,location語法規則大體能夠分爲兩類nginx

一類是指定URL地址:url

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

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

location @name { 
	... 
}
複製代碼

@name是對location設置的一個自定義名稱,由@+自定義命名組成,通常用於try_files後面的內部請求,且自定義命名location中不可再嵌套自定義命名locationcode

舉例:blog

location @xuzheng{
	...
}
複製代碼

location修飾符含義

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

一、 = 表示精確匹配。只有請求的url路徑與後面的字符串徹底相等時,纔會命中。io

舉例:class

location = / {
	...
}
複製代碼

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

舉例:

location ~ \.php$ {
	...
}
複製代碼

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

舉例:

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

四、^~ 是前綴匹配的一種,可是若是該符號後面的字符被匹配上,則被默認爲最佳匹配,即採用該規則,再也不進行後續的查找。

舉例:

location ^~ /blogs {
	...
}
複製代碼

location匹配優先級

最後,咱們瞭解下location的查找規則。下面列出的location查找,從上到下的優先級爲從高到低

一、等號類型,精確匹配
二、^~類型,前綴匹配,不支持正則,若是該符號後面的字符匹配被匹配上,則被默認爲最佳匹配,再也不繼續往下查找
三、~~*類型,正則匹配,~區分大小寫,~*不區分大小寫
四、前綴匹配類型,如location / {}(表示任何以/開頭的URL都匹配)或location /user {},只不過找到合適了還會繼續往下找,直到找到最長匹配
注:使用正則匹配的規則時,順序很重要,location只要找到第一個符合條件的配置規則就會中止查找,即便下面有更匹配的配置

總結

location匹配過程:
一、首先先檢查使用前綴匹配(即字符串匹配)定義的location,選擇最長匹配的項並記錄下來
二、若是找到了精確匹配的location,也就是使用了=修飾符的location,結束查找,使用它的配置。若是沒有找到合適精確匹配,則繼續往下查找
三、若是找到了包含^~的前綴匹配,則中止查找,使用它定義的配置。若是沒有找到合適的帶^~符號的前綴匹配,則繼續往下查找 四、若是找到了使用正則定義的location,則中止查找,使用它定義的配置。若是沒有找到合適的正則匹配,則繼續往下查找 五、使用前面記錄的最長匹配前綴字符location。

相關文章
相關標籤/搜索