Nginx中的一些匹配順序


  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地址。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM