nginx域名乱跳本质是host头匹配错误server块,主因包括server_name+listen重复、加载顺序混乱、https证书错配或默认server接管;需检查conflicting server name警告、用nginx -t和ls -1确认配置与顺序、分离http/https块、显式设default_server兜底。

多个 server_name 冲突导致域名乱跳,本质是 Nginx 在匹配请求 Host 头时选错了 server 块。这不是配置“没生效”,而是匹配逻辑被误触发——常见于重复定义、命名无序、HTTPS 证书错配或默认行为接管。
检查并清理重复的 server_name + listen 组合
冲突警告如 conflicting server name "xxx.com" on 0.0.0.0:80, ignored 表明两个 server 块同时声明了相同端口+相同域名。Nginx 会静默忽略后加载的那个,造成“写了却跳去别处”。
- 运行
nginx -T | grep -A 5 "server_name.*example\.com"查看所有含该域名的块及其位置 - 用
ls -1 /etc/nginx/conf.d/*.conf | sort确认文件加载顺序,避免z-site.conf覆盖app.conf - 删除或注释掉重复项;同一域名+端口组合,只保留一个
server块
确保 server_name 匹配逻辑符合预期
乱跳常因 Host 头未命中任何 server_name,结果落到“默认 server”上(通常是配置里第一个或标了 default_server 的那个)。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
example.com不匹配www.example.com,需显式写server_name example.com www.example.com;或用通配符*.example.com - 空格、大小写、末尾点号(如
example.com.)都会导致匹配失败,可用curl -H "Host: example.com" http://localhost模拟验证 - 至少配置两个
server块,否则 Nginx 会把唯一块当作兜底,server_name实际不参与过滤
HTTPS 场景必须区分 HTTP/HTTPS 块且证书全覆盖
HTTP 层支持多域名空格分隔,但 HTTPS 的 SNI 协商只认 server_name 第一个域名来选证书。若证书不含其余域名,浏览器会报错,部分客户端可能退回到 HTTP 或跳转异常。
- HTTP 和 HTTPS 必须拆成两个独立
server块:listen 80;和listen 443 ssl;不能混写 - 为多个域名申请 SAN 证书:例如
certbot -d example.com -d www.example.com -d shop.example.com - 在 HTTPS
server块中统一引用该证书,并确认ssl_certificate和ssl_certificate_key路径正确
用 default_server 显式控制兜底行为
不设 default_server 时,Nginx 默认把同一端口下第一个 server 块当作兜底。这容易让 IP 直接访问或输错域名的请求意外进入生产站点。
- 在监听 80 和 443 的兜底块中加上
listen 80 default_server;和listen 443 ssl default_server; - 兜底块可返回 444(关闭连接)、403 或重定向到主站,避免信息泄露或 SEO 污染
- 确保兜底块的
server_name为空或设为"",不与其他业务域名冲突










