nginx:“ server_name”解析顺序?


8

我的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
}

我试图找出为什么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

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

Answers:


18

从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,匹配第二个配置。我没有文档来对此进行备份,因此您可以运行一些测试以确认该行为。还有这个文档谈论名称解析。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.