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

掌握 server_name 的通配符与正则匹配优先级,关键不是死记顺序,而是理解 Nginx 实际怎么“挑 server 块”——它不看配置先后,只按四层硬规则逐级筛选,命中即停。
精确匹配永远最先被检查
只要 Host 头(比如 Host: example.com)和某行 server_name example.com; 完全一致(大小写不敏感,但拼写必须相同),Nginx 就立刻选中这个 server 块,后面所有通配符、正则全不看了。
- 可写多个:如
server_name example.com www.example.com api.example.com;,它们同属最高优先级 - 多个精确匹配都符合时,Nginx 选配置文件里第一个出现的,不是按字母或长度选
-
www.example.com和example.com是两个独立精确项,不能互相覆盖
通配符分前后,前缀比后缀更“抢手”
通配符只有两种合法写法:*.example.com(前缀通配)和 example.*(后缀通配)。中间带星号(如 www.*.com)直接无效,会被当作文本匹配或报错。
-
*.example.com匹配api.example.com、shop.example.com,但不匹配example.com或dev.test.example.com(只认单层子域) -
example.*匹配example.org、example.net,适合多后缀场景,但得确保 DNS 真能解析过去 - 前缀通配优先级高于后缀通配;同是前缀时,选最长匹配:若同时有
*.example.com和*.api.example.com,那么backend.api.example.com会命中后者
正则表达式最灵活,但只在最后“出场”
正则不会参与前两轮筛选。只有当所有精确匹配、所有通配符(前缀+后缀)都失败后,Nginx 才开始按配置顺序逐个试正则——第一个成功就停,后面的正则根本不会执行。
- 必须以
~(区分大小写)或~*(不区分)开头,且建议用引号包裹,例如:server_name ~^([a-z0-9_-]+)\.example\.com$; - 支持捕获组:
~^(?<sub>.+)\.example\.com$</sub>可把子域名存为$sub,后续在proxy_pass或rewrite中直接引用 - 性能开销明显高于通配符,高并发下慎用;调试时务必先跑
nginx -t验证语法,再用curl -H "Host: test.example.com" http://127.0.0.1模拟验证
默认 server 是兜底安全阀
如果 Host 头和所有 server_name 都不匹配(包括正则),Nginx 会交给标记了 default_server 的那个 server 块处理。没设的话,就用该端口下配置顺序第一个 server 块——这常导致 404 或页面错乱。
- 推荐显式声明:
listen 443 ssl default_server;+ 对应的server_name _;或空字符串"" - 想响应无 Host 头的请求(比如直接 IP 访问),加
server_name ""; - 生产环境务必检查
nginx -T输出,确认你写的server_name确实被加载且没拼写错误


















