Nginx中server_name匹配优先级为:精确匹配>前缀通配符>后缀通配符>正则表达式,默认server兜底;精确匹配要求Host头完全一致(大小写不敏感),通配符需符合*.example.com或www.*格式,正则须用引号包裹且性能最低。
在 Nginx 中,
的匹配不是“谁写在前面就用谁”,而是有一套明确的优先级规则。理解它,才能避免配置生效异常、域名跳转错乱或 HTTPS 证书不匹配等问题。
精确匹配优先级最高
当请求 Host 头与
完全一致(字符、大小写、端口无关,但不含端口)时,该 server 块被优先选中。这是最高效、最可靠的匹配方式。
✅ 推荐用于核心业务域名
:如
只匹配
⚠️ 注意大小写不敏感但拼写必须一致
:`example.com` 不匹配 `www.example.com` 或 `EXAMPLE.COM`(后者实际可匹配,因 Nginx 内部转小写比较,但书写建议统一小写)
多个精确匹配时,Nginx 按配置文件中出现的
第一个
为准(非优先级,是顺序 fallback)
通配符匹配分前缀与后缀,且互不兼容
Nginx 支持两种通配符语法:
只能出现在开头(
)或结尾(
),但不能同时出现(如
无效)。
匹配任意子域(
、
),但不匹配
本身
匹配
、
,但实际极少使用,因缺乏根域控制,易引发意外匹配
前缀通配符(
)优先级高于后缀通配符(
)
同一类型多个通配符时,选择
最长匹配项
:比如同时存在
和
,则
会匹配后者
正则表达式匹配最灵活,但性能最低、优先级最低
以波浪线
开头表示区分大小写的正则,
表示不区分大小写。正则匹配只在精确匹配和通配符都未命中时触发。
必须用引号包裹整个正则:如
支持捕获组,可在 location 或返回中引用(如
)
多个正则按配置顺序依次尝试,命中即停,不继续往后匹配
⚠️ 避免过度使用
:每次请求都要执行正则引擎,高并发下有明显开销;调试也更困难
默认 server 的作用与设置方式
当所有
都不匹配时,Nginx 会使用标记为
的 server 块(通常加在 listen 指令后)。
例如:
每个监听地址+端口组合最多只能有一个
未设
时,Nginx 使用该端口下
第一个定义的 server 块
作为兜底 —— 这容易导致误响应,务必显式声明
典型用途:拦截非法 Host 请求、返回 444(关闭连接)或 400 错误页
server_nameserver_nameserver_name example.com;Host: example.com**.example.comwww.**.ex*.com*.example.comapi.example.comtest.example.comexample.comwww.*www.awww.bbb*.example.comwww.**.example.com*.api.example.combackend.api.example.com~~*server_name ~^([a-z]+)\.example\.com$;$1server_namedefault_serverlisten 443 ssl http2 default_server;default_serverdefault_server