问题出现得很突然,日志倒是留得挺全。证书 SAN 只有 www.example.com,裸域也解析到同一台机器并做了 301。用户和蜘蛛访问裸域时先遇到证书不匹配,浏览器拦截后才轮到跳转,必应把这批地址记成 SSL 错误。

刚开始盯着「HSTS 已开启 裸域连跳过警告的机会都没有」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。证书 SAN 没有包含裸域。还有一种是裸域的 301 要等 TLS 握手完成才生效。

不容易想到的是,sitemap 和外部链接混用裸域地址。

上来先查证书覆盖的域名

openssl s_client -connect example.com:443 | openssl x509 -noout -text | grep -A1 'Subject Alternative Name'

给证书补上裸域

certbot --expand -d example.com -d www.example.com

接着确认裸域握手后返回 301

curl -sI https://example.com/ | head -3

等前面都确认过,再统一站内链接为带 www 的地址

UPDATE wp_posts SET post_content = REPLACE(post_content,'https://example.com','https://www.example.com');

改完先别撤,确认这几项。裸域握手成功且返回 301,必应的 SSL 错误条目不再新增。

301 救不了证书错误,跳转发生在握手之后,两个域名必须在同一张证书里。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189