先把当时的情况摆出来。自己写的死链检查脚本用 curl -I 取状态码,只要不是 200 就记成死链,每天报两百多条,点进去看全是正常的 301 跳转,真正 404 被淹没在列表里。

这类报错背后常见的原因有几处,逐个排除就行。脚本只取第一跳状态码,没跟随跳转。也可能是curl 默认不带 -L,301 就被当异常。

不容易想到的是,没有区分 4xx 与 5xx,暂时性错误也被算成死链。

动手时先看脚本对 301 的实际输出

curl -sI https://www.example.com/old-post | head -2

再往下改成跟随跳转并只统计最终状态

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

批量跑并把结果按状态码分组

while read u; do curl -sL -o /dev/null -w "%{http_code} $u\n" "$u"; done < urls.txt | sort | uniq -c | sort -nr | head

这次没动代码,只在配置和运行环境上找原因。

隔了一天再看,现象没变,说明不是偶发。

别只看报错消失,验证要多做一步。报告里只剩 404 与 410 两类条目,301 全部被正确归入正常跳转,每天误报量降到个位数。

巡察脚本一定要跟随跳转,只看第一跳会把正常的域名统一跳转全判成故障。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189