先把当时的情况摆出来。巡检数据源直接读了 sitemap,而 sitemap 只保留近两年的文章,站点上还有两万条 2023 年之前的老文,这批页面的 404 和超时从未被发现。
这类报错背后常见的原因有几处,逐个排除就行。sitemap 本身做了时间截断,不代表线上没有这些页面。也可能是老文章没有入口,日志里也很少出现。
少数情况下是巡检没有从数据库或日志补充样本。
先比对 sitemap 与数据库的总数
wp db query "SELECT COUNT(*) FROM wp_posts WHERE post_status='publish' AND post_type='post';"
从访问日志补充历史地址
awk '{print $7}' access.log | sort -u | head -1000 > urls-log.txt
剩下的就是把两批样本合并后再跑巡检
comm -23 <(sort urls-db.txt) <(sort urls-sitemap.txt) | head
手上没有现成的复现脚本,就照着线上请求手工拼了一个。
报错是间歇性的,我蹲守了半小时才抓到一次完整现场。
恢复的判定其实很直接。合并样本后查出 2400 条老文 404,补了重定向后整站的外链落地页可用率回到 99%。
补一句。sitemap 是提交清单,不是站点全貌,巡检样本至少要有一个来自身或日志的来源。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
