Nginx server_name匹配优先级为:1.精确匹配(最高),2.最长前缀/后缀通配符,3.正则匹配(需~或~*开头),4. default_server兜底;未匹配时按显式default_server或同端口首个server块处理。
多个不同域名的 server_name 优先级,不是看谁写在前面,而是按匹配类型分层比对,命中即停。
只要 Host 头和 server_name 字符串完全一致(大小写不敏感,忽略端口),就直接选中该 server 块。比如:
server_name api.example.com; → 只响应 Host: api.example.com
server_name example.com www.example.com; → 任一匹配都走这个块,但 api.example.com 不在此列*.example.com 写在上面,api.example.com 仍会优先匹配精确项当没有精确匹配时,Nginx 会找“最长”的通配符规则:
*.example.com,匹配 shop.example.com、blog.example.com,但不匹配 example.com 或 dev.shop.example.com
example.*(Nginx ≥1.11.10),匹配 example.org、example.net,但不匹配 www.example.com
*.example.com 和 *.shop.example.com,后者更长,backend.shop.example.com 会命中它只有前面两类都没命中,才会执行正则。注意写法必须规范:
~(区分大小写)或 ~*(不区分)开头server_name ~^([a-z0-9_-]+).example.com$;
^www.example.com$(缺波浪线)会被当作文本匹配,无法生效所有匹配都失败时,Nginx 会按以下顺序 fallback:
listen 80 default_server; 的那个 server 块default_server,就用监听同一端口的第一个 server 块(隐式 default)生产环境强烈建议显式配置 default_server,避免意外路由到错误站点。