跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

Nginx中server_name匹配优先级详解:通配符与正则匹配指南

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

相关文章