nginx匹配规则_Nginx系列之server_name定义与匹配规则
Nginx系列之server_name定義與匹配規(guī)則
server_name用來指定請求中的Host頭部,在上一節(jié)的基于域名的虛擬機中,nginx匹配的規(guī)則就是根據(jù)server_name的不同,結(jié)合請求頭的Host頭部,來決定請求的路由目標。server_name有三種不同的配置格式,且不用配置格式的優(yōu)先級也不相同。接下來我們學習一下具體的配置格式與匹配順序。
1. server_name的配置格式之通配符匹配
# nginx.confserver { listen 80; server_name *.example.org; ...}server { listen 80; server_name mail.*; ...}通配符格式中的*號只能在域名的開頭或結(jié)尾,并且*號兩側(cè)只能是.,所以www.*.example.org和w*.example.org是無效的。*號可以匹配多個域名部分,*.example.org不僅與www.example.org匹配,而且也與www.sub.example.org匹配。.example.org是比較特殊的通配符格式, 可以同時匹配確切名稱example.org和通配符名稱*.example.org。
2. server_name的配置格式之正則匹配
server { listen 80; server_name ~^(?<user>.+)\.example\.net$; ...}正則匹配格式,必須以~開頭,比如:server_name ~^www\d+\.example\.net$;。如果開頭沒有~,則nginx認為是精確匹配,或者如果匹配字符中含有*號,則會被認為是通配符匹配,不過非法的通配符格式。在邏輯上,需要添加^和$錨定符號。注意,正則匹配格式中.為正則元字符,如果需要匹配.,則需要反斜線轉(zhuǎn)義。如果正則匹配中含有{和}則需要雙引號引用起來,避免nginx報錯,如果未加雙引號,則nginx會報如下錯誤:directive "server_name" is not terminated by ";" in ...。正則表達式命名捕獲的變量可以在nginx進行引用,下面示例:
server { server_name ~^(www\.)?(?<domain>.+)$; location / { root /sites/$domain; }}正則表達式捕獲也可以通過數(shù)字進行引用,下面示例:
server { server_name ~^(www\.)?(.+)$; location / { root /sites/$2; }}數(shù)字引用不推薦使用,此種方式容易被覆蓋。
3. server_name的配置格式之精確匹配
server { listen 80; server_name example.org www.example.org; ...}精確匹配格式指的除了通配符匹配和正則匹配之外的格式,就這么簡單。
4. 特殊匹配格式
1. server_name ""; 匹配Host請求頭不存在的情況。2. server_name "-"; 無任何意義。3. server_name "*"; 它被錯誤地解釋為萬能的名稱。 它從不用作通用或通配符服務(wù)器名稱。相反,它提供了server_name_in_redirect指令現(xiàn)在提供的功能。 現(xiàn)在不建議使用特殊名稱“ *”,而應(yīng)使用server_name_in_redirect指令。5. 匹配順序
1. 精確的名字2. 以*號開頭的最長通配符名稱,例如 *.example.org3. 以*號結(jié)尾的最長通配符名稱,例如 mail.*4. 第一個匹配的正則表達式(在配置文件中出現(xiàn)的順序)6. 優(yōu)化
1. 盡量使用精確匹配;2. 當定義大量server_name時或特別長的server_name時,需要在http級別調(diào)整server_names_hash_max_size和server_names_hash_bucket_size,否則nginx將無法啟動。個人博客:https://www.aiopsclub.com/
總結(jié)
以上是生活随笔為你收集整理的nginx匹配规则_Nginx系列之server_name定义与匹配规则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python用户界面导入图片_pytho
- 下一篇: Nginx —— 检查配置文件ngi