Nginx配置HTTPS到HTTPS重定向报conflicting server name错误
报错根因
这个警告的触发逻辑非常明确:0.0.0.0:443 监听端口下存在两个 server_name 完全一致(都是old-name.example.com)的虚拟主机块。Nginx 同端口下对相同域名的虚拟主机只会加载第一个读取到的配置,后续重复的配置会被直接忽略,这也是你写的HTTPS到新域名的跳转规则完全不生效的原因。
你当前配置里,第一个server块是原有带业务、CORS规则、SSL配置的443虚拟主机,第三个server块是你新加的443跳转规则,两个块同端口、同域名,直接触发冲突。
修复方案
核心逻辑是删掉重复的虚拟主机块,把跳转逻辑合并到唯一的对应域名server块里,步骤如下:
- 删除重复定义的第三个443 server块
- 修改第一个443 server块:移除原有业务相关的location配置、CORS头配置,保留Certbot生成的SSL证书相关配置,直接在块根层级配置301跳转到新域名
- 简化第二个80端口server块:移除Certbot自动生成的冗余host判断和末尾的404返回规则,直接配置全量HTTP请求跳转到HTTPS
修正后可直接用的配置
替换 /etc/nginx/sites-enabled/myconf.conf 内的全部内容即可:
# 80端口HTTP服务:统一跳转至HTTPS server { listen 80; server_name old-name.example.com; return 301 https://$host$request_uri; } # 443端口HTTPS服务:旧域名永久跳转至新域名 server { listen 443 ssl; # managed by Certbot server_name old-name.example.com; # 保留原有Certbot生成的全部SSL配置,删除这部分会导致HTTPS握手失败 [ssl config...] # 原有业务、CORS相关的location配置全部删除,直接配置全局跳转 return 301 https://www.new-name.com$request_uri; }
生效操作
配置修改完成后依次执行以下命令:
- 校验配置语法是否正确:
nginx -t,确认输出syntax is ok、test is successful再继续下一步 - 重载Nginx配置让规则生效:
systemctl reload nginx
避坑提醒
- Nginx虚拟主机匹配规则:同一监听端口维度,
server_name精确匹配的虚拟主机只会生效第一个被读取到的配置,重复定义的同名配置会被直接丢弃,不要给同端口同域名配置多个server块 - HTTPS跳转必须在对应server块中配置有效SSL证书,否则用户请求会先触发SSL证书错误,无法正常收到跳转响应
- 所有Nginx配置修改后必须先执行
nginx -t做语法校验,避免配置错误导致服务中断
内容的提问来源于stack exchange,提问作者SaltySteven
相关产品推荐
相关产品推荐

