先把当时的情况摆出来。巡检数据源直接读了 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 是提交清单,不是站点全貌,巡检样本至少要有一个来自身或日志的来源。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189