nginx-3 服務(wù)器名稱

服務(wù)器名稱作為在server_name指令的參數(shù),掌控著使用哪個(gè)server處理request的決定權(quán)。詳見如何處理一個(gè)請(qǐng)求。它可以分為全名稱(exact names)、通配符名稱(wildcard names)和正則名稱(regular expressions)三種類型。

server {
    listen       80;
    server_name  example.org  www.example.org;
    ...
}

server {
    listen       80;
    server_name  *.example.org;
    ...
}

server {
    listen       80;
    server_name  mail.*;
    ...
}

server {
    listen       80;
    server_name  ~^(?<user>.+)\.example\.net$;
    ...
}

當(dāng)通過名稱查找一個(gè)虛擬服務(wù)器時(shí),如果匹配到多個(gè)server_name,究竟使用哪個(gè)由以下優(yōu)先級(jí)決定。

  1. 全名稱
  2. 以 * 開頭的最長通配符名稱,比如 *.example.org
  3. 以 * 結(jié)尾的最長通配符名稱,比如 mail.*
  4. 第一個(gè)匹配的正則名稱(按配置文件中的出現(xiàn)順序)

通配符名稱

通配符名稱只能在名稱的開始或結(jié)束處包含星號(hào),并且只能在點(diǎn)的邊上包含星號(hào)。所以,諸如www.*.example.orgw*.example.org都是不合法的。但是,這類名稱可以通過正則表達(dá)式實(shí)現(xiàn)。例如~^www\..+\.example\.org$~^w.*\.example\.org$。一個(gè)星號(hào)可以匹配多個(gè)名稱部分。例如,*.example.org既可以匹配www.example.org也可以匹配www.sub.example.org

.example.org是個(gè)特殊的通配符名稱,既可以匹配全名稱example.org,也可以匹配通配符名稱*.example.org。

正則名稱

要使用正則表達(dá)式,服務(wù)器名稱必須要以波浪號(hào)~起頭。

server_name  ~^www\d+\.example\.net$;

否則,它將被視為一個(gè)全名稱,或者如果表達(dá)式包含一個(gè)星號(hào),它將被視為一個(gè)通配符名稱(很可能是一個(gè)無效的名稱)。不要忘記設(shè)置“^”和“”。它們?cè)谡Z法上不是必需的,但在邏輯上是必需的(^表示開頭,表示結(jié)尾)。還要注意域名點(diǎn)應(yīng)該用反斜杠轉(zhuǎn)義。包含花括號(hào){}的正則表達(dá)式應(yīng)該被""引用。

server_name  "~^(?<name>\w\d{1,3}+)\.example\.net$";

A named regular expression capture can be used later as a variable:

server {
    server_name   ~^(www\.)?(?<domain>.+)$;

    location / {
        root   /sites/$domain;
    }
}

其他名稱(Miscellaneous names)

總是存在一些服務(wù)器名稱是要被特殊對(duì)待的。

  1. 請(qǐng)求不含Host頭部。如果不使用默認(rèn),就必須顯示指定一個(gè)空字符串。
server {
    listen       80;
    server_name  example.org  www.example.org  "";
    ...
}
  1. 請(qǐng)求的Host頭部中的值為IP地址
server {
    listen       80;
    server_name  example.org
                 www.example.org
                 ""
                 192.168.1.1
                 ;
    ...
}
  1. 請(qǐng)求的Host頭部中的值為無效域名,如---或者!@#
server {
    listen       80  default_server;
    server_name  _;
    return       444;
}

不存在匹配所有的域名并且指定默認(rèn)服務(wù)器,默認(rèn)服務(wù)器是listem port的屬性。

server {
    listen       80;
    listen       8080  default_server;
    server_name  example.net;
    ...
}

server {
    listen       80  default_server;
    listen       8080;
    server_name  example.org;
    ...
}

國際化名稱

國際化域名(IDN)應(yīng)使用服務(wù)器名稱指令中的ASCII(punycode)表示形式指定:

server {
    listen       80;
    server_name  xn--e1afmkfd.xn--80akhbyknj4f;  # пример.испытание
    ...
}

優(yōu)化(Optimization)

查找速度

全名稱 > 通配符名稱 > 正則名稱

因此,為了最佳的查找性能,應(yīng)該優(yōu)先使用全名稱,再考慮通配符名稱,最后再考慮正則名稱。

server {
    listen       80;
    server_name  example.org  www.example.org  *.example.org;
    ...
}

# 顯然,上面的配置的查找性能更好。下面會(huì)被解釋成 *.example.org。
server {
    listen       80;
    server_name  .example.org;
    ...
}

如果定義了大量的服務(wù)器名稱,或者定義了過長的服務(wù)器名稱。則可能需要在HTTP級(jí)別使用server_names_hash_max_sizeserver_names_hash_bucket_size指令調(diào)整值。

兼容性(Compatibility)

對(duì)應(yīng)server_name的參數(shù),不同版本的nginx所支持的特性有所不同。

  • 0.9.4 開始支持$hostname 這個(gè)特殊的服務(wù)器名稱
  • 0.8.48 開始server_name的默認(rèn)值是空字符串""
  • 0.8.25 開始支持Named regular expression server name captures
  • 0.7.47 開始支持Regular expression server name captures
  • 0.7.12 開始支持空服務(wù)器名稱""
  • 0.6.25 開始支持通配符或者正則表達(dá)式名稱作為首個(gè)服務(wù)器名稱(server_name)
  • 0.6.7 開始支持正則表達(dá)式服務(wù)器名稱
  • 0.6.0 開始支持example.*之類的通配符服務(wù)器名稱
  • 0.3.18 開始支持.example.org這類特殊格式服務(wù)器名稱
  • 0.1.13 開始支持*.example.org之類的通配符服務(wù)器名稱
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容