做爲一名PHPer,配置nginx是咱們必會的技能項之一。可是當用戶請求到達nginx以後,是如何匹配到對應的配置項的呢?php
首先咱們先了解下location的語法規則,location語法規則大體能夠分爲兩類nginx
一類是指定URL地址:url
location [ = | ~ | ~* | ^~ ] uri { ... }
另外一類則是指定自定義名稱:code
location @name { ... }
@name
是對location設置的一個自定義名稱,由@
+自定義命名
組成,通常用於try_files後面的內部請求,且自定義命名location中不可再嵌套自定義命名locationblog
舉例:字符串
location @xuzheng{ ... }
上文咱們提到location語法規則有一類是指定URL地址,其中運用了一些修飾符,下面咱們看下這些修飾符的含義io
一、 =
表示精確匹配。只有請求的url路徑與後面的字符串徹底相等時,纔會命中。class
舉例:配置
location = / { ... }
二、 ~
表示該規則是使用正則定義的,區分大小寫。file
舉例:
location ~ \.php$ { ... }
三、 ~*
表示該規則是使用正則定義的,不區分大小寫。
舉例:
location ~* \.php$ { ... }
四、^~
是前綴匹配的一種,可是若是該符號後面的字符被匹配上,則被默認爲最佳匹配,即採用該規則,再也不進行後續的查找。
舉例:
location ^~ /blogs { ... }
最後,咱們瞭解下location的查找規則。下面列出的location查找,從上到下的優先級爲從高到低
一、等號類型,精確匹配
二、^~
類型,前綴匹配,不支持正則,若是該符號後面的字符匹配被匹配上,則被默認爲最佳匹配,再也不繼續往下查找
三、~
和~*
類型,正則匹配,~
區分大小寫,~*
不區分大小寫
四、前綴匹配類型,如location / {}(表示任何以/開頭的URL都匹配)或location /user {},只不過找到合適了還會繼續往下找,直到找到最長匹配
注:使用正則匹配的規則時,順序很重要,location只要找到第一個符合條件的配置規則就會中止查找,即便下面有更匹配的配置
一、首先先檢查使用前綴匹配(即字符串匹配)定義的location,選擇最長匹配的項並記錄下來
二、若是找到了精確匹配的location,也就是使用了=
修飾符的location,結束查找,使用它的配置。若是沒有找到合適精確匹配,則繼續往下查找
三、若是找到了包含^~
的前綴匹配,則中止查找,使用它定義的配置。若是沒有找到合適的帶^~
符號的前綴匹配,則繼續往下查找四、若是找到了使用正則定義的location,則中止查找,使用它定義的配置。若是沒有找到合適的正則匹配,則繼續往下查找五、使用前面記錄的最長匹配前綴字符location。