我的 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):
按名称搜索虚拟服务器时,如果名称与多个指定的变体匹配(例如,通配符名称和正则表达式匹配),则将按照以下优先顺序选择第一个匹配的变体:
- 确切名称
- 以星号开头的最长通配符名称,例如“*.example.org”
- 以星号结尾的最长通配符名称,例如“mail.*”
- 第一个匹配的正则表达式(按配置文件中出现的顺序)
答案2
文档说:
将传入的 HTTP 请求的 Host 标头与 Nginx 配置文件中的服务器 { ... } 块进行比较,并选择第一个匹配的块。
似乎发生的情况是,它从所有server
块中选择了最佳匹配,因此www.sub.domain.com
,匹配第二个配置。我没有文档来支持这一点,因此您可以运行一些测试来确认该行为。还有本文档谈论名称解析。