nginx:“server_name”解析顺序?

nginx:“server_name”解析顺序?

我的 nginx.conf 中有多个“服务器”块。文档中关于 server_name 匹配顺序的说明似乎有误。

我的配置文件看起来像这样:

server {
  listen 80
  server_name domain.com *.domain.com

  # do stuff
}

server {
  listen 80
  server_name sub.domain.com *.sub.domain.com

  # do something else
}

我试图弄清楚为什么主机 = www.sub.domain.com 的请求会发往正确的位置(第二台服务器),而文档表明它应该发往第一台服务器。

Nginx 文档表明服务器块会“按顺序”检查匹配情况,这意味着任何带有主机 *.sub.domain.com 的请求都应该由第一台服务器捕获,而不是第二台服务器。(http://wiki.nginx.org/HttpCoreModule#服务器名称

此外,* 通配符可匹配任意数量的子域名部分,因此 *.domain.com 可匹配 www.sub.domain.com。(http://nginx.org/en/docs/http/server_names.html#wildcard_names

如果这个文档有误,那么实际的匹配顺序是什么?

答案1

来自 nginx 文档(http://nginx.org/en/docs/http/server_names.html):

按名称搜索虚拟服务器时,如果名称与多个指定的变体匹配(例如,通配符名称和正则表达式匹配),则将按照以下优先顺序选择第一个匹配的变体:

  1. 确切名称
  2. 以星号开头的最长通配符名称,例如“*.example.org”
  3. 以星号结尾的最长通配符名称,例如“mail.*”
  4. 第一个匹配的正则表达式(按配置文件中出现的顺序)

答案2

文档说:

将传入的 HTTP 请求的 Host 标头与 Nginx 配置文件中的服务器 { ... } 块进行比较,并选择第一个匹配的块。

似乎发生的情况是,它从所有server块中选择了最佳匹配,因此www.sub.domain.com,匹配第二个配置。我没有文档来支持这一点,因此您可以运行一些测试来确认该行为。还有本文档谈论名称解析。

相关内容