现场是这样的。自建巡检脚本只判断状态码是否小于 400,302 被当成正常页面,八百多条跳转到错误地址的链接半年没被发现,等人工抽查时已经掉了不少流量。

中间走过弯路,把「跳转目标返回 404,但脚本没有做二次校验」当成主因,改完现象没变。

这类报错背后常见的原因有几处,逐个排除就行。脚本把 3xx 全部归为可访问,没有继续跟跳转;curl 默认不跟随跳转,脚本读到 302 就结束了;巡检样本只取 sitemap,站内链接根本没有覆盖。

动手时先用不跟随跳转的方式看原始状态码

curl -s -o NUL -w "%{http_code} %{redirect_url}\n" https://www.example.com/post-1024/

跟随跳转后再看最终状态

curl -sL -o NUL -w "%{http_code} %{url_effective}\n" https://www.example.com/post-1024/

批量导出 3xx 清单

findstr /c:" 302 " access.log | measure -Line

等前面都确认过,再把跳转终点也纳入巡检

curl -sL -o NUL -w "%{http_code}\n" https://www.example.com/old-post/

恢复的判定其实很直接。脚本补上跳转跟随与终点校验后,八百多条问题链接被清出,站内 404 数量回到两位数。

提醒一点。巡检只看第一跳的状态码没有意义,302 后面可能是 404,也可能是另一个 302。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189