nginx server_name匹配順序


先敘述一下環境。

服務器Nginx上面配置了多個域名,其中域名是分散放在多個目錄下,按業務來划分的,然后再 nginx.conf 中國通過include來引用。

最近新增一個業務,只 listen 80;不配置server_name,計划是讓沒有匹配到server_name的域名,通過此項配置來訪問到后端的應用。該域名單獨創建一個目錄,並通過include配置到nginx.conf中,由於有多個include,新增的默認加到最后面。

想法很好,然而在測試的過程中發現了新的問題。訪問某個不匹配的域名是,發現地址被強跳到了https,反復檢查了新增的域名配置,並沒有rewrite的操作,nginx.conf 也無異常。最后發現是include引用順序的問題。第一個include中,某些server塊中含有rewrite的配置。

可見,在尋找server_name的過程中,發現沒有匹配到任何一個server_name,然后就默認走第一個server塊,其中有rewrite的配置,因此出現了強跳https的情況。

 

在開始處理一個http請求時,nginx會取出header頭中的host,與配置文件中每個server的server_name進行匹配,以此決定到底由哪一個server塊來處理這個請求。如果server_name 匹配失敗,並且listen沒有default屬性,那么端口號和server的順序將發揮作用,它會去找端口匹配的位置最靠前的server塊。

最后說一下匹配順序:

  • 1、完全匹配
  • 2、通配符在前的,如*.test.com
  • 3、通配在后的,如www.test.*
  • 4、正則匹配,如~^.www.test.com$

如果都不匹配:

  • 1、優先選擇listen配置項后有default或default_server的
  • 2、如果沒有配default或者default_server,則找到匹配listen端口的第一個server塊

 


免責聲明!

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



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