curl -s https://example.com/sitemap.xml | grep -o "<loc>[^<]*" | cut -c6- > urls.txt
while read u; do curl -o /dev/null -s -w "%{http_code} $u\n" "$u"; done < urls.txt | sort | uniq -c
站点地图里一共 312 条 URL,抽 40 条有 17 条返回 404,抓取统计里这些地址每周还在被请求二十多次。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,地图由文章表直接生成,文章删了但缓存文件没重建,旧地址一直留在 XML 里。引擎读到 404 会反复确认,不会因为地图换了就立刻放手。
这次卡住的地方就在「sitemap 死链」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
处理上按这个顺序:先按地图逐条请求,把非 200 的地址列出来;清掉地图缓存重新生成,确认已删文章不再出现;给删除的文章返回 410,比 404 更早被放弃;在搜索后台提交新地图并请求重新抓取。
改完只确认一件事:地图里的地址全部返回 200,抓取统计里 404 的请求一周内降到个位数。
