Nginx 設定檔系列 - location 匹配規則

location的設定,可以參考官網的說明。語法如下:

location [ = | ~ | ~* | ^~] uri { ... }
location @name

其中,中括號[]裡的符號,以下稱為修飾符;uri 稱為前綴字串。
@name則是會定義一個location變數,類似連結,用來讓request轉向。不會進行正則匹配,也不能使用巢狀結構。

先說明匹配的優先順序

  1. 當接收到request時,首先會找出沒有加修飾符,僅有前綴字串的項目,如根目錄 /。nginx會選取有匹配的項目並記住與request最匹配(最長)的項目
  2. 接著檢查有加修飾符的項目,根據這些項目在設定檔中的順序,依次檢查,並選擇第一個匹配成功的項目
  3. 若沒有任何一個正則匹配的話,則應用第1步所找到的項目。

location 後方接的修飾符,用以下範例說明比較容易理解

  • ~ 波浪符號,表示後面接的是一個正則匹配,有區分大小寫。

location ~ ^/mydir/(.+\.php)$ { ... }
本範例的意思是 在/mydir這個目錄及子目錄下的所有副檔名為php的檔案。

  • ~* 波浪加星號,同上,後面接的是正則匹配,但不區分大小寫

location ~* ^/mydir/(.+\.php)$ { ... }

  • ^~ 若符合前綴字串且最長的項目有這個修飾符,則不用再檢查其他的正則

location ^~ /images/ { ... }

  • = 等號,表示精確匹配,當找到完全匹配前綴文字的項目時,直接應用並停止搜尋,也因此有此修飾符的項目內,無法再使用巢狀式設定。

location = / { ... }
只匹配網站根目錄,本範例如果放在設定檔最前面,因為不再往後匹配,所以可以加速首頁的執行

其他說明,如果一個location的前綴文字以 斜線 / 結尾,且以 proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass或 memcached_pass來處理request。則會進行特殊作業:符合前綴文字,但沒有/結尾的項目,會301轉址給有/結尾的項目。以下範例說明:

location /user/ {
    proxy_pass http://user.example.com;
}
 
location = /user {
    proxy_pass http://login.example.com;
}