Nginx遇相同server_name时仅匹配首个配置块,导致域名被覆盖;应检查重复域名、统一声明主/子域、慎用default_server,并通过nginx -t和curl验证。

当多个 Nginx 虚拟主机配置中使用了相同的 server_name,Nginx 会按配置文件加载顺序,只匹配第一个有效块,其余域名实际被“覆盖”——这是导致“能解析、却打不开”或“打开的是别的网站”的典型原因。
确认是否存在 server_name 冲突
执行以下命令,快速列出所有已启用的虚拟主机及其绑定域名:
grep -r "server_name" /etc/nginx/conf.d/ /etc/nginx/sites-enabled/ 2>/dev/null | grep -v "#"
重点检查:是否出现重复的域名(如 example.com 出现在两个不同配置文件中),或泛域名(server_name *.example.com;)与精确域名同时存在;也注意 www 和非 www 是否被不同配置分别定义但未统一处理。
确保每个域名有唯一且明确的 server 块
一个域名应只由一个 server 块负责,推荐做法是:
- 为每个主域名(如
example.com)和其常用子域名(如www.example.com)在同一server块中声明:server_name example.com www.example.com; - 避免用通配符覆盖多个业务域名,例如不要写
server_name *.com; - 禁用或删除不再使用的旧配置文件(如
default.conf或测试用的test.conf),防止干扰
验证 default_server 是否误抢流量
如果某个 server 块带 default_server 标志,而它的 server_name 又未匹配请求头中的 Host,它就会兜底响应所有未明确匹配的请求——包括你本该访问的域名。
检查方式:
nginx -T 2>/dev/null | grep -A 5 "listen.*default_server"
若发现 default_server 所在块绑定了空 server_name 或不相关域名,应移除该标记,或确保它仅用于真正兜底的维护页。
重载配置并验证生效结果
修改后务必语法检查 + 重载,不能跳过:
-
nginx -t—— 确认无语法错误 -
nginx -s reload—— 平滑重载(不是 restart) - 用
curl -I -H "Host: example.com" http://127.0.0.1模拟请求,看响应头是否来自预期站点 - 浏览器访问时按 F12 → Network → 查看响应 Header 中的
Server或页面内容,交叉验证是否命中正确配置

















