我在我的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第一个匹配变体:
该文件说:
将传入的HTTP请求的主机头与Nginxconfiguration文件中的服务器{…}块进行比较,并select第一个匹配的。
看起来会发生的是它从所有的server块中select最好的匹配,所以www.sub.domain.com匹配第二个configuration。 我没有任何文件来支持,所以你可以运行一些testing来确认这个行为。 还有这个文件谈论名称parsing。