记录一下那天晚上的排查过程。服务器同时监听 80 和 443,两个版本都返回 200,搜索结果里同一篇文章出现 http 和 https 两条,流量被拆成两半。

刚开始盯着「sitemap 里同时混着两种协议的地址」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。迁移时只加了证书,没有配置 80 端口的强制跳转。少数情况下是页面里的 canonical 跟着访问协议动态生成,自己指自己。

少数情况下是GSC 里 http 和 https 是两个独立资源,数据各算各的。

第一件事是确认 80 端口返回的状态码

curl -sI http://www.example.com/ | head -3

再往下在 Nginx 里加统一的 301 跳转

server { listen 80; server_name www.example.com; return 301 https://$host$request_uri; }

随后把 canonical 固定成 https 绝对地址

grep -rn 'rel="canonical"' wp-content/themes/ | head -3

剩下的就是统一 sitemap 里的协议写法

grep -o '<loc>[^<]*' sitemap.xml | cut -d: -f1 | sort | uniq -c

怎么算真的好了,看的是同一批现象。跳转上线后 http 版本逐步退出索引,两周内重复的两条结果合并成一条,点击量回到单版本时的水平。

容易忽略的是,双协议并存时最怕 canonical 动态生成,页面跟着访问入口指自己,等于主动告诉搜索引擎两份都合法。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189