sitemap 由脚本从全表导出,删掉的文章也在里面,八万条地址中有三万条返回 404,提交后 GSC 显示读取成功但抓取效果很差。

一开始怀疑是「分片文件的 lastmod 全量刷新,掩盖了真实变化」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。导出脚本没有按状态过滤,草稿和回收站也在内。也可能是已删除文章没有同步清理 sitemap 缓存。

另外,404 地址集中在一个分片,整片被降低调度优先级。

动手时先抽样检查 sitemap 里的地址状态

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

批量测一批地址的返回码

for u in $(grep -o '<loc>[^<]*' sitemap-3.xml | sed 's/<loc>//' | head -50); do curl -s -o /dev/null -w '%{http_code} %{url_effective}\n' $u; done

接着导出时只取已发布状态

SELECT ID FROM wp_posts WHERE post_status='publish' AND post_type='post';

剩下的就是删除空分片并重新提交索引

curl -s https://www.example.com/sitemap_index.xml | grep -c sitemap

中途换过一次思路,把范围缩到最小的那一层,反而快了。

恢复的判定其实很直接。sitemap 里 404 占比降到百分之一以下,剩余地址的抓取率明显上升,新文章当天就能被抓。

sitemap 是自己给蜘蛛的承诺清单,里面死链越多,整份文件的调度权重就越低。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189