现场是这样的。最近一周的 404 有 70% 集中在 /news/ 目录下,访问来源里既有外链也有站内推荐,看不出是哪一边的问题。

中间走过弯路,把「被采集站抓走旧地址后持续回链,产生新的 404」当成主因,改完现象没变。

原因不止一个,得分开看。栏目改版后旧路径没有做映射,外链全部指向旧地址;站内推荐模块用的是缓存数据,仍然输出旧链接;URL 规则区分大小写,部分外链写成了大写。

先按目录和来源统计 404

awk '$9==404{print $7}' access.log | awk -F/ '{print "/"$2"/"}' | sort | uniq -c | sort -rn | head

接着抽样几条查清来源

grep '2026-11-08' access.log | awk '$9==404{print $7, $11}' | head -10

给旧目录补一层 301 映射

rewrite ^/news/(.*)$ https://www.example.com/article/$1 permanent;

剩下的就是清理推荐模块里的旧链接缓存

redis-cli --scan --pattern 'rec:*' | head

别只看报错消失,验证要多做一步。补上映射并清掉缓存后,/news/ 的 404 在三天内降到个位数,来自外链的流量重新回到对应文章。

提醒一点。处理 404 不能只看数量,先按目录和来源分组,能立刻区分是路由问题还是外链问题。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189