nginx server_name 详解

1,173 阅读1分钟

在 Nginx 中,server_name 指令用于指定一个虚拟主机(server block)所应响应的域名或主机名。通过配置 server_name,Nginx 可以根据请求的域名将请求路由到正确的虚拟主机。以下是对 server_name 的详细介绍:

基本用法

server_name 指令通常用于 server 块中,语法如下:

server {
    listen 80;
    server_name example.com www.example.com;
    # 其他配置
}

在这个例子中,Nginx 将对 example.comwww.example.com 的请求进行处理。

支持的模式

  1. 精确名称匹配

    • 直接指定完整的域名,如 example.com
    • 如果请求的主机名与配置的 server_name 完全匹配,则该虚拟主机会被选择。
  2. 通配符名称匹配

    • 支持前缀和后缀通配符。
    • 前缀通配符:*.example.com 匹配 www.example.commail.example.com 等。
    • 后缀通配符:example.* 匹配 example.comexample.net 等。
    • 通配符不能出现在中间,比如 www.*.com 是无效的。
  3. 正则表达式匹配

    • 使用 ~~* 前缀来指定正则表达式。
    • ~ 区分大小写,~* 不区分大小写。
    • 例如:
      server_name ~^www\d+\.example\.com$;
      
      这会匹配 www1.example.comwww2.example.com 等。

优先级

Nginx 在匹配请求的主机名时,会按照以下优先级顺序进行:

  1. 精确名称:完全匹配的域名。
  2. 最长的通配符名称:最长的前缀或后缀通配符。
  3. 正则表达式:按配置顺序进行匹配。
  4. 默认服务器:如果没有其他匹配,则使用 listen 指令中指定的默认服务器。

例子

server {
    listen 80 default_server;
    server_name _;
    # 处理未匹配的请求
}

server {
    listen 80;
    server_name example.com www.example.com;
    # 处理 example.com 和 www.example.com 的请求
}

server {
    listen 80;
    server_name *.example.org;
    # 处理所有子域的 example.org 请求
}

server {
    listen 80;
    server_name ~^www\d+\.example\.net$;
    # 处理 www1.example.net, www2.example.net 等请求
}

注意事项

  • server_name 的值在域名解析时不区分大小写。
  • 配置多个 server_name 时,使用空格分隔。
  • 如果没有匹配到任何 server_name,请求会被路由到 listen 指令中标记为 default_server 的虚拟主机。

通过合理配置 server_name,可以在同一台服务器上托管多个网站或应用程序,并根据请求的域名将流量正确地路由到对应的虚拟主机。