站点迁到 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 版本在索引里逐步退出,两周内同一页面只剩一条记录。
协议迁移要连模板、插件、缓存三处一起改,只改服务器配置的话,页面里的标签还是旧的。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
