Nginx的server_name匹配优先级为:精确匹配>前缀通配符>后缀通配符>正则表达式,默认server兜底;精确匹配要求Host头完全一致(大小写不敏感),通配符仅支持.example.com或example.格式,正则须以~或~*开头且性能最低。

Nginx 的 server_name 匹配不是按配置顺序“从上到下”执行,而是严格遵循一套内置优先级规则。配错顺序会导致请求被错误 server 块处理,比如本该走正则的子域名被通配符“截胡”,或 www 跳转失效。
精确匹配永远最高优先
只要 Host 头与 server_name 字符完全一致(大小写不敏感),就立即命中,不继续比对其他规则。
-
server_name example.com;只匹配Host: example.com,不匹配www.example.com或EXAMPLE.COM(虽然后者实际能匹配,但书写建议统一小写) - 可写多个精确域名:
server_name example.com www.example.com;,它们同属一级优先级 - 多个精确匹配时,Nginx 采用“首个出现”的原则,而非按字母排序
通配符分前缀和后缀,且前缀 > 后缀
通配符只允许两种合法形式:*.example.com(前缀通配)和 example.*(后缀通配),中间带星号(如 www.*.com)无效。
-
*.example.com匹配api.example.com、shop.example.com,但不匹配example.com或dev.test.example.com(仅支持单层子域) -
example.*匹配example.org、example.net,适合多 TLD 场景,但需确保 DNS 实际解析有效 - 同一类型多个通配符时,选“最长匹配”:若同时存在
*.example.com和*.api.example.com,则backend.api.example.com会命中后者
正则表达式匹配最灵活,但优先级最低
正则只在精确匹配和所有通配符都未命中时才触发,性能开销最大,必须以 ~(区分大小写)或 ~*(不区分)开头,并用引号包裹(含特殊字符时必需)。
- 正确写法:
server_name ~^([a-z0-9_-]+)\.example\.com$;;错误写法:server_name ^www\.example\.com$;(缺波浪线,会被当作文本匹配) - 支持命名捕获:
~^(?<sub>.+)\.example\.com$</sub>,后续可用$sub引用;也支持数字捕获:$1 - 多个正则按配置顺序依次尝试,第一个成功即停止,不继续往后查
兜底机制与调试关键点
当所有 server_name 都不匹配时,Nginx 会交给标记 default_server 的块;若没设,则使用该端口下第一个 server 块——这常是 404 或跳转错乱的根源。
- 显式声明兜底:
listen 443 ssl default_server; - 验证是否生效:
nginx -t检查语法,nginx -T查看最终加载的完整配置 - 模拟请求测试:
curl -H "Host: test.example.com" https://127.0.0.1,配合error_log ... notice;观察匹配日志

















