Nginx中的一些匹配順序

silent發表於2016-05-24

  Nginx中經常需要做各種配置,總結如下:

  1、server_name配置

  nginx中的server_name指令主要用於配置基於名稱虛擬主機,同一個Nginx虛擬主機中,可以繫結多個server_name,各個域名用空格隔開即可。如下:  

server
{
    listen       80;
    server_name  test.com www.test.com;
    。。。 。。。
}

  如果server_name有多個,那麼通過程式碼如$_SERVER["SERVER_NAME"]獲取的始終將是Nginx server_name配置中的第一個域名,第一個域名就相當於Apache虛擬主機配置中的ServerName,後面的域名就相當於Apache的ServerAlias。

  如果nginx中有多個server塊,那麼請求匹配server_name的順序如下:

  首先匹配準確的server_name,如:server_name  test.com www.test.com;

  然後匹配以*萬用字元開始的server_name,如:server_name  *.test.com;

  然後匹配以*萬用字元結束的server_name,如:server_name  www.test.*;

  最後匹配正規表示式形式的server_name,如:server_name ~^(?<www>.+)\.test\.com$;

  以上只有有一項匹配到以後就會停止搜尋。

  2、Location配置

  location的語法規則如下: location [=|~|~*|^~] /uri/ { … }.

  在nginx中location分為兩類:普通location和正則location。普通 location ”是以“ = ”或“ ^~ ”為字首或者沒有任何字首的 /uri/,包括“/”;“正則 location ”是以“ ~ ”或“ ~* ”為字首的 /uri/ 。

  那麼如果一個 server 塊中編寫了多個 location 的時候,Nginx對於客戶端請求匹配順序如何呢?

  官網說明如下:先匹配普通location,取的最大字首匹配,再匹配正則location,如果匹配到則按照正則匹配,如果有多個正則可以匹配到,則按照第一個匹配結果處理,如果正則匹配失敗則使用普通location的最大字首匹配。Nginx也設定了幾種機制可以打斷這種順序,分別是“^~ ”、“= ”或者location精確匹配。

  簡單的講順序如下:

  首先普通location“=”精確匹配;

  然後普通location的URL精確匹配;

  然後普通location”^~"配置;

  然後正則匹配;

  然後其他普通location匹配;

  最後“/”通用匹配

  3、Rewirte配置

  rewrite指令的最後一項引數為flag標記,flag標記有一下四種,說明一下:

  1> last

  標記在本條rewrite規則執行完畢後,會對其所在server{......}標籤重新發起請求。使用last實現URI重寫後,瀏覽器位址列不變。使用alias指令必須用last標記。

  2> break

  標記在本條規則匹配完成後,終止匹配,不再匹配後面的規則。使用break實現URI重寫後,瀏覽器位址列不變。使用proxy_pass指令時,需要使用break標記。

  3> redirect

  返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址。

  4> permanent

  返回301永久重定向,瀏覽器地址會顯示跳轉後的URL地址。

相關文章