Nginx中server_name匹配按精确匹配、通配符匹配、正则匹配、default_server兜底的优先级顺序执行,且先确定listen地址端口再筛选server块。

Nginx 中 server_name 的匹配不是“先到先得”,而是有一套明确的优先级规则。理解它,才能避免配置多个域名时出现意料之外的 fallback 行为。
精确匹配优先级最高
当请求的 Host 头与某个 server_name 完全一致(字符、大小写、点号位置都相同),该 server 块会被优先选中。Nginx 不区分大小写比较,但要求完全相等。
-
server_name example.com;→ 匹配Host: example.com -
server_name www.example.com;→ 不匹配Host: example.com
通配符匹配次之(仅支持前导或尾随 *)
Nginx 支持两种通配符形式,但不支持正则式通配(如 *.example.* 无效):
-
server_name *.example.com;→ 匹配www.example.com、api.example.com,但不匹配example.com -
server_name www.*;→ 匹配www.example.com、www.net,但实际中极少使用,且不推荐
注意:通配符必须是独立的 token,不能混在普通字符串里(如 www.*.com 是非法语法)。
正则表达式匹配优先级最低(但高于 default_server)
以波浪线 ~ 开头的 server_name 被视为 PCRE 正则表达式,按配置顺序从上到下匹配第一个成功项:
-
server_name ~^([a-z]+)\.example\.com$;→ 捕获子域名 -
server_name ~^www\.(.+)$;→ 匹配所有 www 子域
正则匹配开销略大,且顺序敏感,建议只在必要时使用,并确保逻辑清晰、无重叠。
default_server 是兜底项,不参与常规优先级排序
带有 default_server 参数的 server 块,在所有其他匹配失败(包括 Host 头为空、不合法或无对应 server_name)时被启用。它和优先级无关,而是显式指定的 fallback:
-
listen 80 default_server;必须和server_name同行或在同一 server 块中声明 - 一个 listen 地址+端口上只能有一个
default_server - 没有
default_server时,Nginx 默认使用配置中第一个匹配该 listen 的 server 块作为兜底
不复杂但容易忽略:server_name 匹配发生在 listen 层之后,即先确定用哪个 IP:port 的配置集,再在其中按上述规则筛选 server 块。










