这个坑值得记一笔。巡检脚本每天扫 sitemap 里的 URL,把非 200 全部记为死链,某天 WAF 升级后大批页面返回 403,脚本据此删了两千条正常文章,收录一周内掉了三成。

刚开始盯着「删除操作直接执行,没有人工复核环节」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。脚本只判断状态码是否 200,没区分 403 和 404;403 来自临时风控,过几分钟再请求就恢复;脚本用固定 IP 高频请求,自己触发了风控。

复现 403 并看响应体

curl -sI https://www.example.com/post/1 | head -5

再往下对可疑 URL 做二次确认

for i in 1 2 3; do curl -s -o /dev/null -w '%{http_code} ' https://www.example.com/post/1; sleep 30; done

随后把删除改成先标记待审

UPDATE posts SET status='pending_review' WHERE id IN (1,2,3);

降低巡检频率并加随机间隔

grep -n 'sleep' scripts/check_links.sh

怎么算真的好了,看的是同一批现象。403 页面复测恢复 200,误删文章从回收站还原,收录量两周后回到删除前。

补一句。死链判定要区分 404、410 和 403、429,后两者是临时状态,删内容前至少隔天复测一次。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189