域名跳转出现SSL安全警告,核心原因不在跳转动作本身,而是跳转目标地址的HTTPS证书配置不完整。浏览器接管跳转后会重新检查落地页证书,目标域名证书有效且链路完整,警告自然消失。
为什么跳转后才弹出安全警告
大部分站长把“域名跳转”理解成URL转发,忽略了浏览器请求的其实是新地址,比如用户访问http://old.com,服务器返回301告诉浏览器“去https://new.com”,浏览器随即向new.com发起HTTPS请求并检查证书,如果new.com的证书过期、域名不匹配或证书链缺了中间证书,警告就弹出来了。
你以为在检查旧域名,实际上浏览器检查的是落地页
这里要区分两种跳转:
- HTTP跳HTTPS:用户输的是http://,服务器返回301到https://,此时浏览器还没建立安全连接,直接跟随Location头访问落地页,检查落地页证书。
- HTTPS跳HTTPS:用户直接访问https://old.com,浏览器会先验证old.com的证书,再执行跳转,如果old.com证书已失效,跳转不会发生,用户只会看到红色错误页。
多级跳转同理,比如old.com → www.new.com → new.com,每一跳的落地页都要有有效证书,行业共识认为,先证书后跳转是降低故障率的唯一顺序。
域名跳转SSL配置的正确顺序:先证书后跳转
第一步:给目标域名签发并部署证书
证书与域名绑定,与“跳转规则”无关,新域名必须单独申请证书。
- 登录服务器,确认443端口已经放行。
- 通过面板(宝塔/AMH)或命令行申请Let’s Encrypt免费证书,或购买商业证书。
- 完成域名所有权验证(DNS解析验证或文件验证)。
- 下载证书文件,通常包含
fullchain.pem和privkey.pem。
部署时确认目标域名对应的server块(而非跳转域名)加载了这两份文件。
第二步:在nginx中配置跳转规则
新旧域名同服务器时,推荐用return 301
,配置量最小:
server {
listen 80;
server_name old.com www.old.com;
return 301 https://new.com$request_uri;
}
server {
listen 443 ssl;
server_name new.com www.new.com;
ssl_certificate /etc/letsencrypt/live/new.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/new.com/privkey.pem;
# 其余站点配置
root /var/www/new_site;
index index.html;
}
注意:旧域名也要配置HTTPS监听,上面示例只监听了80端口,如果用户直接输https://old.com,浏览器会先验证old.com证书此时old.com没有443监听,浏览器直接报“无法建立安全连接”,想覆盖这种情况,需要给old.com单独签一张证书并配置443 server块:
server {
listen 443 ssl;
server_name old.com;
ssl_certificate /etc/letsencrypt/live/old.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/old.com/privkey.pem;
return 301 https://new.com$request_uri;
}
第三步:用命令行验证证书链完整性
许多未备案的海外服务器或自签证书会缺中间证书,浏览器会报“证书链不完整”,部署完可用openssl检查:
openssl s_client -connect new.com:443 -servername new.com
输出里如果出现Verify return code: 0 (ok),说明浏览器信任该证书,如果返回unable to get local issuer certificate,请将CA中间证书合并到fullchain文件里,或检查证书文件路径是否指向了完整链。
nginx域名跳转SSL配置常见问题盘点
修改域名后SSL证书不生效?按顺序排查
出现证书不生效提示时,依次做以下动作:
- 看证书有效期,Let’s Encrypt证书有效期只有90天,过期后必定报警告。
- 看SAN字段,执行
openssl x509 -in fullchain.pem -noout -text | grep "Subject Alternative Name",确认域名列表里包含new.com。 - 看server_name是否配置正确,证书可以包含多个域名,但nginx只会把证书加载到对应域名的server块中。
- 看DNS解析是否指向新服务器,如果DNS还在旧服务器,跳转会走到旧站点,证书全是旧的。
- 重启nginx使配置生效,不重启直接reload也有效,但个别版本对证书路径变更不生效,建议
nginx -t后强制reload。
证书部署正确但仍然报错?多半是这几类细节
- 跳转域名访问的是http,落地页是https,但http server块没写
return 301,如果直接配了listen 80但没有跳转规则,用户访问80端口会看到默认页,这类“报错”其实是没跳走。 - 落地页引用了http静态资源,页面里加载了
http://开头的图片、CSS或JS,浏览器会提示“混合内容”,降低安全评级甚至显示不完全的锁图标。 - 配置文件顺序导致证书加载错位,nginx先匹配
listen 443的server块,如果多个server块都用server_name _兜底,跳转域名可能落到错误证书上。
域名跳转SSL证书不匹配怎么办:证书类型怎么选
新老域名共存时,证书选择直接决定配置复杂度。
| 证书类型 | 覆盖域名数量 | 适用场景 | 管理成本 |
|---|---|---|---|
| 单域名证书 | 1个主域名 | 只有一个新域名需要持证书 | 低 |
| 多域名证书(SAN) | 2-10个指定域名(同账号下) | 新老域名同时需要HTTPS访问 | 中 |
| 通配符证书 | 1个主域名及其二级子域名 | 主站+多个子站跳转 | 中 |
多数中小站点用单域名证书即可,旧域名只做跳转,但要注意:旧域名在跳转链上也需要有效证书(除非确定用户永远不会直接输入https://old.com),如果你无法预判用户习惯,用SAN证书把新旧域名塞进同一个证书文件,部署时两个server块引用同一份证书文件,配置会简化不少。
部署完成后如何自测跳转是否安全
用curl验证跳转链路
curl -I http://old.com
重点看两处:
- 状态码是否为
301或302 Location头是否带https://new.com及路径参数
再验证落地页证书有效性:
curl -v https://new.com 2>&1 | grep "SSL certificate verify ok"
浏览器无痕模式验证
无痕模式能避免本地缓存和HSTS干扰,打开无痕窗口,分别输入http://old.com和https://old.com,观察是否出现SSL警告页,有些场景要区分电脑端和手机端:少数老手机浏览器对证书链的校验更严格,电脑端正常不代表手机端正常。
这在域名更换时尤其重要直接复用旧服务器的配置,不如先从零搭建一遍再作跳转,业内专家指出,多级跳转场景下“跳转链路上每一跳要么有证书,要么先用HTTP访问再跳到HTTPS”,这个细节能规避大量排查时间。
域名跳转SSL配置常见问题解答
老域名跳新域名,老域名的证书过期了影响跳转吗?
影响,用户直接输入https://old.com时,浏览器会先验证old.com证书,过期会直接中断连接并弹警告,跳转不会发生,所以跳转链路上每个域名都需要有效证书,即使功能只是“中转”。
跳转了还是显示“不安全”,但证书检查明明是对的?
多数情况是页面里的子资源仍走HTTP,按F12打开开发者工具,在Console标签页里搜索“Mixed Content”,会定位到具体http请求,把资源地址统一改为https://或改用协议相对链接,警告即可消除。
配置完成后多长时间生效?
证书部署到服务器并重启nginx即生效,通常1分钟以内,DNS指向调整则看解析记录的TTL,短则几十秒,长则数小时,建议把旧域名解析的TTL值提前调低到300秒,切换前24小时操作,能显著缩短生效等待窗口。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/623587.html





