• server_name支持配置方式
  • 因server_name支持多种配置方式,所以可能存在,请求头中HOST字段可以同时匹配到多个server_name,所以需要对server_name匹配指定优先级
  • 如下:
    1)确切名称
    2)通配符名称,以星号开头的最长最优先,例如:"*.example.org"
    3)通配符名称,以星号结尾的最长最有限,例如:“mail.*”
    4)按配置文件中的出现顺序,匹配正则表达式名称
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$;
    ...
}
  • Wildcard names(通配符名称)
  • 仅在名称的开头或结尾包含通配符(星号),且仅在点边界包含通配符(星号),例如:“www.*.example.org”、"w * .example.org"配置是无效的。这个需求可以通过正则匹配实现
  • 星号可以匹配多个名称部分,例如:"*.example.org",可同时匹配 www.example.orgwww.sub.example.org
  • 注意:".example.org" 形式的特殊通配符名称可用于匹配确切名称 example.org 和通配符名称 “* .example.org”
  • Regular expressions names(正则表达式名称)
  • nginx正则表达式语法和PCRE兼容,表达式以~开头,例如:server_name ~^www\d+.example.net$; 否则将被视为确切名称,如包含通配符(星号),将被视为通配符名称(很可能是无效通配符语法)
  • 使用正则表达匹配,记住添加^和$作为起止锚点符号,可以使逻辑上更完整
  • 正则表达式中有{或者}符号,表达式使用引号包起来,例如:server_name “~^(?<name>\w\d{1,3}+).example.net$”;
  • 正则表达式支持抓取自定义变量,变量可在后面配置中使用
  • Miscellaneous names(需要特殊处理的server name配置)
情况1,
请求头中没有HOST字段,又想指定某个server(非default server)来处理,则server_name值可以设置为空
假如server块中没有server_name指令,nginx默认server_name值为空
server {
    listen       80;
    server_name  example.org  www.example.org  "";
    ...
}

情况2,
使用ip请求,请求头HOST是ip地址,则相对应的server_name指令也可以使用ip配置
server {
    listen       80;
    server_name  example.org
                 www.example.org
                 ""
                 192.168.1.1
                 ;
    ...
}

情况3,
假如使用default_server的配置,server_name可以配置成无效字符串不影响结果
请求依然会按照default_server配置,被指定的server接收处理 
具体查看:[nginx请求处理流程]()
server {
    listen       80  default_server;
    server_name  _;
    return       444;
}
  • Internationalized names
国际化域名(IDN)应使用server_name指令中的ASCII(Punycode)表示
server {
    listen       80;
    server_name  xn--e1afmkfd.xn--80akhbyknj4f;  # пример.испытание
    ...
}
  • Optimization(优化)
说明1,
1)确切名称、星号开头通配符名称、星号结尾的通配符名称存储在绑定了对应端口号的三张哈希表中
2)哈希表的大小在配置阶段已被优化,可高效查询,有关哈希表详情可[查看](http://nginx.org/en/docs/hash.html)
3)匹配过程
首先,nginx查找固定名称哈希表
然后,nginx查找以星号开头的哈希表
然后,nginx查找以星号结尾的哈希表
查找通配符表效率要低于固定名称表,注意:特殊的通配符例如:".example.org"并不是存放在固定名称的哈希表中
正则表达式匹配是最慢的,并且是按照顺序匹配

基于以上三点原因,应该尽可能使用固定名称匹配,比如下面两个配置,第一个配置更优秀:
server {
    listen       80;
    server_name  example.org  www.example.org  *.example.org;
    ...
}

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

说明2,
假如server name数量很多,或者名称很长,将有必要在server对应的http模块中进行配置
详情见nginx官网

说明3,
某个监听的端口只有一个server块配置,nginx将不会执行搜索哈希表步骤(也不会为该端口建立哈希表)
但,如果server name使用正则表达式匹配,nginx将执行该表达式捕获变量

参考:Nginx Server names