location的設定,可以參考官網的說明。語法如下:
location [ = | ~ | ~* | ^~] uri { ... }
location @name
其中,中括號[]裡的符號,以下稱為修飾符;uri 稱為前綴字串。
@name則是會定義一個location變數,類似連結,用來讓request轉向。不會進行正則匹配,也不能使用巢狀結構。
先說明匹配的優先順序
- 當接收到request時,首先會找出沒有加修飾符,僅有前綴字串的項目,如根目錄 /。nginx會選取有匹配的項目並記住與request最匹配(最長)的項目
- 接著檢查有加修飾符的項目,根據這些項目在設定檔中的順序,依次檢查,並選擇第一個匹配成功的項目
- 若沒有任何一個正則匹配的話,則應用第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;}