nginx server_name匹配順序
先敘述一下環(huán)境。
服務器Nginx上面配置了多個域名,其中域名是分散放在多個目錄下,按業(yè)務來劃分的,然后再 nginx.conf 中國通過include來引用。
最近新增一個業(yè)務,只 listen 80;不配置server_name,計劃是讓沒有匹配到server_name的域名,通過此項配置來訪問到后端的應用。該域名單獨創(chuàng)建一個目錄,并通過include配置到nginx.conf中,由于有多個include,新增的默認加到最后面。
想法很好,然而在測試的過程中發(fā)現了新的問題。訪問某個不匹配的域名是,發(fā)現地址被強跳到了https,反復檢查了新增的域名配置,并沒有rewrite的操作,nginx.conf 也無異常。最后發(fā)現是include引用順序的問題。第一個include中,某些server塊中含有rewrite的配置。
可見,在尋找server_name的過程中,發(fā)現沒有匹配到任何一個server_name,然后就默認走第一個server塊,其中有rewrite的配置,因此出現了強跳https的情況。
在開始處理一個http請求時,nginx會取出header頭中的host,與配置文件中每個server的server_name進行匹配,以此決定到底由哪一個server塊來處理這個請求。如果server_name 匹配失敗,并且listen沒有default屬性,那么端口號和server的順序將發(fā)揮作用,它會去找端口匹配的位置最靠前的server塊。
最后說一下匹配順序:
- 1、完全匹配
- 2、通配符在前的,如*.test.com
- 3、通配在后的,如www.test.*
- 4、正則匹配,如~^.www.test.com$
如果都不匹配:
- 1、優(yōu)先選擇listen配置項后有default或default_server的
- 2、如果沒有配default或者default_server,則找到匹配listen端口的第一個server塊

浙公網安備 33010602011771號