Nginx 域名匹配取决于请求 Host 头、server_name 匹配顺序及配置加载顺序;需验证 Host 值、排查 default_server 抢占、检查文件加载序与语法,并区分精确/通配/正则三种匹配模式。

排查 server_name 域名匹配不生效,关键不是看配置写没写对,而是看 Nginx 实际按什么规则选中了哪个 server 块。它不读你“想配成什么样”,只认请求的 Host 头 + 配置里的匹配顺序 + 文件加载顺序。
确认请求实际携带的 Host 头
Nginx 完全依赖 HTTP 请求中的 Host 请求头做匹配,不是 DNS 解析结果,也不是浏览器地址栏显示内容。可以用以下方式验证:
- 用
curl -v http://your-domain.com查看响应头里> Host: your-domain.com是否准确 - 在浏览器开发者工具 Network 标签中,点开请求 → Headers → Request Headers →
Host字段值 - 如果用 IP 直接访问(如
http://192.168.1.100),Host头默认就是该 IP,此时server_name example.com永远不会匹配上
检查是否有默认 server 块抢走流量
只要存在 listen 80 default_server 或未设 server_name 的 server 块,它就会兜底处理所有不精确匹配的请求。常见陷阱:
-
server_name _;是通配占位符,常被用作默认块,会捕获所有未匹配域名 -
server { listen 80; }(没写server_name)也会成为隐式默认块 - Ubuntu/Debian 系统自带的
/etc/nginx/sites-enabled/default很可能开着default_server,务必检查并注释或删除
验证配置文件加载顺序和命名问题
Nginx 按字母序加载 include 的配置文件(如 conf.d/*.conf),而 server_name 匹配时只取第一个完全匹配的块 —— 所以顺序决定命运:
- 文件名含点号(如
me3g.com.conf)可能被某些系统排序异常,导致本该后加载的配置提前生效;建议统一用下划线(me3g_com.conf) - 运行
nginx -T(大写 T)可输出**最终合并后的全部生效配置**,直接搜索server_name,确认你写的域名是否真的出现在某个server块里、有没有被其他块覆盖 - 修改后必须
nginx -t测试语法 +systemctl reload nginx(不是 restart),否则变更不生效
区分匹配类型与常见写法错误
server_name 支持三种匹配模式,写错一种就白配:
-
精确匹配:
server_name example.com;→ 只匹配Host: example.com,不匹配www.example.com或example.com:8080 -
通配符匹配:
server_name *.example.com;→ 匹配www.example.com、api.example.com,但不匹配example.com -
正则匹配:
server_name ~^([^.]+)\.example\.com$;→ 注意开头的~,且需转义点号;错误写成~www.example.com会被当字面量处理 - 多个域名用空格分隔:
server_name example.com www.example.com;,别用逗号











