问题出现得很突然,日志倒是留得挺全。证书 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 救不了证书错误,跳转发生在握手之后,两个域名必须在同一张证书里。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
