Nginx Location 路徑匹配

Nginx 經過不一樣的 location 配置來匹配訪問的 uri. 這樣即可以作到對不一樣的 uri 執行不一樣的操做.html

location 的路徑匹配能夠分爲兩種: 前綴匹配和正則匹配, 基本語法爲:nginx

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

其中, =, ^~, ~~*分別表示:
=: 精確匹配 => 前綴匹配;
^~: 優先前綴匹配 => 前綴匹配;
~: 正則匹配(大小寫敏感) => 正則匹配;
~*: 正則匹配(大小學不敏感) => 正則匹配;bash

匹配規則

  1. 首先檢查使用前綴匹配的 location, 找到最長匹配項而且記錄下來
  2. 若是找到了精確匹配的 location(=), 則結束查找, 直接使用該 location 的配置; 若是最長匹配的 location 是優先前綴匹配(^~), 也結束查找, 使用該 location 的配置
  3. 而後按照順序檢查使用正則匹配的 location, 一旦匹配則結束查找, 直接使用匹配的 location 的配置
  4. 若是找完全部的正則匹配後仍是沒有匹配到, 則採用前綴匹配查找時記錄下來的的最長匹配項的 location 的配置

栗子:

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}
複製代碼

以上配置中:
/: 精確匹配 A, 則直接採用配置 A, 再也不繼續檢查.
/index.html: 首先檢查前綴匹配, 最長匹配爲 B; 而後檢查正則匹配, 未匹配到, 則採用配置 B.
/documents/documents.html/: 首先檢查前綴匹配, 最長匹配爲 C; 而後檢查正則匹配, 未匹配到, 則採用配置配 C.
/images/pic.jpg: 首先檢查前綴匹配, 匹配到最長匹配爲 D, 此時 D 爲優先前綴匹配, 再也不繼續檢查, 直接採用配置 D;
/documents/pic.jpg: 首先檢查前綴匹配, 最長匹配爲 C; 而後按照順序檢查正則匹配, 匹配了 E, 則中止檢查, 直接採用配置 D'memcached

前綴匹配中的 slash 後綴

若是在 location 前綴匹配中以斜線 / 結尾, 而且 location 中的配置爲proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass 或者 grpc_pass 中的一個. 在訪問的時候若是沒有斜線結尾, 那麼 Nginx 會默認返回帶斜線的 301 重定向. 好比:spa

location /doc-1/ {
    proxy_pass http://localhost:3000;
}
複製代碼

不帶 slash 訪問 code

不帶 slash 訪問
帶slash 訪問
帶slash 訪問

可是若是在配置 location 的時候沒有以斜槓結尾, 形成的結果是當你以加斜槓的 uri 去訪問的時候, Nginx 沒法匹配該 uri.cdn

location /doc-2 {
    proxy_pass http://localhost:3000;
}
複製代碼

不帶 slash 訪問 htm

不帶 slash 訪問
帶 slash 訪問
帶 slash 訪問

參考:
ngx_http_core_module.html#locationblog

相關文章
相關標籤/搜索