站点迁到 https 后主题模板里还留着 http 的 canonical,蜘蛛读到后先请求 http 地址,再被 301 送回 https,同一页面在索引里出现两条记录。

一开始怀疑是「页面缓存里存着迁移前的 HTML,头部标签没有刷新」,查了一圈,方向不对。

原因不止一个,得分开看。模板里的域名是写死的,没有跟着协议切换更新。另一种情况是SEO 插件的 canonical 被主题覆盖,输出的是旧值。

还有一种情况,http 版本仍能返回 200,没有强制跳转。

上来先抓页面确认 canonical 原文

curl -s https://www.example.com/post-1024/ | findstr /i "rel=\"canonical\""

测试 http 地址的响应

curl -s -o NUL -w "%{http_code} %{redirect_url}\n" http://www.example.com/post-1024/

然后把模板与插件里的域名统一改为 https

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

等前面都确认过,再清页面缓存并重新抓取

curl -s -X PURGE https://www.example.com/post-1024/

隔了一天再看,现象没变,说明不是偶发。

恢复的判定其实很直接。canonical 改成 https 后,http 版本在索引里逐步退出,两周内同一页面只剩一条记录。

协议迁移要连模板、插件、缓存三处一起改,只改服务器配置的话,页面里的标签还是旧的。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189