轉載:
在開始處理一個http請求時,nginx會取出header頭中的host,與nginx.conf中每個server的server_name進行匹配,以此決定到底由哪一個server塊來處理這個請求。
server_name與host匹配優先級如下:
1、完全匹配
2、通配符在前的,如*.test.com
3、在后的,如
www.test.*
4、正則匹配,如~^\.www\.test\.com$
如果都不匹配
1、優先選擇listen配置項后有default或default_server的
2、找到匹配listen端口的第一個server塊
空口無憑,驗證一下:
1、最高優先級:完全匹配
首先,在nginx.conf中創建2個server,1個完全匹配,1個通配符匹配
通配符server放在最前,以證明完全匹配的優先級與配置順序無關

接下來配置域名映射
vim /etv/hosts
訪問測試:
結論:完全匹配的優先級高於通配符匹配
2、第二優先級:通配符在前
修改server配置,還是2個server,通配符在后的server放到前面,同樣是為了消除配置順序給測試帶來的影響
訪問測試
結論:通配符在前的優先級高於在后的
3、第三優先級:通配符在后
修改server配置,還是2個server,通配符在后的server放到前面,同樣是為了消除配置順序給測試帶來的影響
訪問測試
結論:通配符在后的優先級高於正則匹配的server
到此,第一部分的匹配規則已經驗證完畢。接下來驗證都不匹配的情況
4、listen配置項中default的影響
配置3個server
訪問測試
結論:正則匹配雖然優先級較低,但是仍然高於default;在都匹配不到的情況下,default開始起作用。
5、驗證default的作用域,default在匹配成功的情況下是否會影響優先級
2個server,給優先級低的server配置default屬性
訪問測試
結論:default只能作用於匹配不到的情況下,而且nginx.conf不可以配多個default,否則nginx重啟時候會提示錯誤
6、驗證沒有匹配成功,且沒有default的情況
2個server
訪問測試
結論:在server_name都匹配失敗的前提下,並且listen沒有default屬性,那么端口號和server的順序將發揮作用,它會去找端口匹配的位置最靠前的server。
最終的結論就是開頭的這段話:
1、完全匹配
2、通配符在前的,如*.test.com
3、在后的,如
www.test.*
4、正則匹配,如~^\.www\.test\.com$
如果都不匹配
1、優先選擇listen配置項后有default或default_server的
2、找到匹配listen端口的第一個server塊