nginx:“server_name”解析顺序?

use*_*356 9 nginx

我的 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
}
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚为什么当文档表明它应该转到第一台服务器时,为什么带有 host = 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

如果此文档有误,实际匹配顺序是什么?

Jus*_*nks 20

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

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

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

  • @ObayAbd-Algader 是的,你错了。正则表达式是最慢的匹配方法,因此仅在最后进行测试。您应该尽可能使用准确的名称或通配符。 (2认同)

cor*_*ump 3

文档说:

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

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