一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx server 配置中多个不同域名的 server_name 优先级如何算

时间:2026-08-15 12:39:48 编辑:袖梨 来源:一聚教程网

Nginx server_name匹配优先级为:1.精确匹配(最高),2.最长前缀/后缀通配符,3.正则匹配(需~或~*开头),4. default_server兜底;未匹配时按显式default_server或同端口首个server块处理。

多个不同域名的 server_name 优先级,不是看谁写在前面,而是按匹配类型分层比对,命中即停。

精确匹配永远最高优先级

只要 Host 头和 server_name 字符串完全一致(大小写不敏感,忽略端口),就直接选中该 server 块。比如:

  1. server_name api.example.com; → 只响应 Host: api.example.com
  2. server_name example.com www.example.com; → 任一匹配都走这个块,但 api.example.com 不在此列
  3. 哪怕你把 *.example.com 写在上面,api.example.com 仍会优先匹配精确项

通配符分两类,前缀优先于后缀

当没有精确匹配时,Nginx 会找“最长”的通配符规则:

  1. 前缀通配符:如 *.example.com,匹配 shop.example.comblog.example.com,但不匹配 example.comdev.shop.example.com
  2. 后缀通配符:如 example.*(Nginx ≥1.11.10),匹配 example.orgexample.net,但不匹配 www.example.com
  3. 若同时存在 *.example.com*.shop.example.com,后者更长,backend.shop.example.com 会命中它

正则匹配最后兜底,性能最低

只有前面两类都没命中,才会执行正则。注意写法必须规范:

  1. 必须以 ~(区分大小写)或 ~*(不区分)开头
  2. 含特殊字符时建议加引号,例如:server_name ~^([a-z0-9_-]+).example.com$;
  3. 错误写法如 ^www.example.com$(缺波浪线)会被当作文本匹配,无法生效

没匹配上怎么办?default_server 是关键

所有匹配都失败时,Nginx 会按以下顺序 fallback:

  1. 显式声明了 listen 80 default_server; 的那个 server 块
  2. 没设 default_server,就用监听同一端口的第一个 server 块(隐式 default)
  3. IP 直接访问、Host 头为空、或 Host 值非法时,也走这条路

生产环境强烈建议显式配置 default_server,避免意外路由到错误站点。

热门栏目