问题出现得很突然,日志倒是留得挺全。老模板里写 canonical 时省掉了协议,只留 //www.example.com/article/1。站点上 HTTPS 后,部分爬虫把它补成 http 版本,另一些直接当成外链,规范信号全乱,重复组每天都在变。
刚开始盯着「CDN 改写 HTML 时把 // 当成注释截断」,折腾了半个多小时,排掉了。
排查方向其实有限,先把可能性排一排。协议相对地址在不同解析器下的补全规则不一致。还有一种是页面被 http 与 https 两个入口访问,canonical 跟着协议浮动。
另外,sitemap 里是 https,canonical 解析成 http,两份信号打架。
先抓页面源码看实际输出
curl -s https://www.example.com/article/1 | grep -o 'rel="canonical"[^>]*'
然后改成带协议的绝对地址
<link rel="canonical" href="https://www.example.com/article/1">
全站扫描残留写法
grep -rn 'rel="canonical" href="//' templates/
复验 http 入口的解析结果
curl -s http://www.example.com/article/1 | grep canonical
同一份数据我导出了两份,一份留底,一份拿来试。
改完先别撤,确认这几项。所有页面 canonical 都是 https 绝对地址,http 入口访问时也一致,重复组数量停止增长。
这里还有个坑。协议相对地址在 https 普及后没有优势,canonical 这种关键标签直接写全绝对地址。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
