nginx:“server_name”的parsing顺序?

我在我的nginx.conf中有多个“服务器”块。 该文档似乎错误的server_name匹配发生的顺序。

我的conf看起来像这样:

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#server_name )

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

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

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

当按名称search虚拟服务器时,如果名称匹配多个指定变体(例如,通配符名称和正则expression式匹配),则将按照以下顺序select第一个匹配变体:

  1. 确切的名字
  2. 以星号开头的最长通配符名称,例如“* .example.org”
  3. 最长的通配符名称以星号结尾,例如“mail。*”
  4. 首先匹配正则expression式(按照在configuration文件中出现的顺序)

该文件说:

将传入的HTTP请求的主机头与Nginxconfiguration文件中的服务器{…}块进行比较,并select第一个匹配的。

看起来会发生的是它从所有的server块中select最好的匹配,所以www.sub.domain.com匹配第二个configuration。 我没有任何文件来支持,所以你可以运行一些testing来确认这个行为。 还有这个文件谈论名称parsing。