先看现象。sitemap 里列的是带斜杠的地址,页面 canonical 却是不带斜杠的版本,两者互相 301,蜘蛛每晚只抓到列表前几百条就停。

真正麻烦的地方在于,几个原因的现象几乎一样。sitemap 由插件生成,canonical 由主题输出,两边各写各的。少数情况下是URL 规范化没统一,带斜杠和不带斜杠两套地址都能打开。

还有一种情况,301 链条让每个 URL 多花一次请求,抓取预算被无效跳转吃掉。

另外,sitemap 里同时存在 http 和 https 两种前缀。

动手时先抽取 sitemap 前一百条看格式

curl -s https://www.example.com/sitemap-1.xml | grep -o '<loc>[^<]*' | head -5

随后对比页面里实际输出的 canonical

curl -s https://www.example.com/a/ | grep -o 'rel="canonical"[^>]*'

批量检查 sitemap 地址的最终状态码

while read u; do curl -s -o /dev/null -w "%{http_code} $u\n" "$u"; done < urls.txt

中间停过一次,把已经改的东西回滚干净,再重新来一遍。

恢复的判定其实很直接。sitemap 的每一条地址直接返回 200 且与 canonical 完全一致,日志里的 301 计数降到个位数,抓取条数当晚翻倍。

sitemap 不是提交任务清单,它是给蜘蛛的推荐路径,路径自身还带跳转时,抓取预算会被白白消耗在跳转上。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189