官方文檔:http://nginx.org/en/docs/http/ngx_http_core_module.html#locationhtml
Syntax: | location [ = | ~ | ~* | ^~ ] uri { ... }nginx location @name { ... }正則表達式 |
Default: | — |
Context: | server, location |
根據請求uri來設置配置app
進行匹配的目標是規範化的URI,規範化的URI是指在解碼「%XX」 形式編碼的文本、解析相對路徑符號 「.」 和 「..」,以及將重複斜槓壓縮爲單斜槓以後的URI。memcached
一個location能夠由帶前綴的字符串或者正則表達式來定義。正則表達式使用前置的「~*」修飾符 (不區分大小寫匹配),或者 「~」 修飾符(區分大小寫匹配)來指定。爲了找到與指定request匹配的location,Nginx首先使用前綴字符串定義的location進行匹配。其中,選擇並記住匹配前綴最長的位置。 而後按正則表達式在配置文件中出現的順序檢查它們。 正則表達式的搜索在第一次匹配時終止,並使用相應的配置。若是沒有找到與正則表達式匹配的,則使用前面提到的前綴位置的配置。編碼
除了下面提到的一些例外,位置塊能夠嵌套。spa
對於不區分大小寫的操做系統,例如macOS和Cygwin,與前綴字符串匹配會忽略大小寫(0.7.7)。可是,比較僅限於一個字節區域設置。操作系統
正則表達式能夠包含捕獲(0.7.40),稍後能夠在其餘指令中使用。.net
正則表達式能夠包含捕獲(0.7.40),稍後能夠在其餘指令中使用。code
若是最長前綴字符串匹配的location具備「^ ~」修飾符,那麼正則表達式不檢查。
此外,使用「 =」修飾符能夠定義URI和位置的精確匹配。若是找到徹底匹配,則搜索終止。例如,若是/頻繁發生「 」請求,則定義「 location = /」將加速這些請求的處理,由於搜索在第一次比較以後當即終止。這樣的位置顯然不能包含嵌套位置。
在 0.7.1 到 0.8.41的版本中, 若是請求與前綴位置匹配而沒有 「=」 和「^~」 修飾符,則搜索也會終止,而且不會檢查正則表達式。
讓咱們用一個例子來講明以上內容:
location = / { configuration A } location / { configuration B } location /documents/ { configuration C } location ^~ /images/ { configuration D } location ~* \.(gif|jpg|jpeg)$ { configuration E }
「 /」請求將匹配配置A,「 /index.html」請求將匹配配置B,「 /documents/document.html」請求將匹配配置C,「 /images/1.gif」請求將匹配配置D,「 /documents/1.jpg」請求將匹配配置E。
@」前綴定義命名位置。這樣的位置不用於常規請求處理,而是用於請求重定向。它們不能嵌套,也不能包含嵌套位置。
若是位置由以斜槓字符結尾的前綴字符串定義,而且請求由 proxy_pass, fastcgi_pass, uwsgi_pass,scgi_pass, memcached_pass或 grpc_pass之一處理,則執行特殊處理。爲了響應URI等於此字符串但沒有尾部斜槓的請求,帶有代碼301的永久重定向將返回到請求的URI,並附加斜槓。若是不須要,能夠像下面這樣定義URI和位置的徹底匹配:
location /user/ { proxy_pass http://user.example.com; } location = /user { proxy_pass http://login.example.com; }
(非官方補充:若是/user配置與/user/相同,就不用專門定義= /user)