记录一下那天晚上的排查过程。新模板的 404 页面做了友好提示,但响应码写成了 200,改版后三个月索引量涨了三万条,点进去全是「页面不存在」的提示页。

刚开始盯着「错误页被加进了 sitemap 的分页逻辑」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。模板直接输出提示内容,没有设置响应状态码。另一种情况是Nginx 的 try_files 兜底到 index.php,框架没有再覆盖状态码。

另外,CDN 把 404 页缓存成 200 并长期保留。

第一件事是确认随机死链返回的状态码

curl -s -o /dev/null -w '%{http_code}\n' https://www.example.com/post/not-exist-1024

再往下在框架层显式设置 404 状态

status_header(404);

Nginx 对不存在的路径直接返回 404

try_files $uri $uri/ =404;

等前面都确认过,再清掉 CDN 上被缓存成 200 的错误页

curl -X PURGE https://www.example.com/post/not-exist-1024

别只看报错消失,验证要多做一步。随机死链稳定返回 404,索引里提示页条目开始下降,抓取日志中这类地址的重复请求减少。

容易忽略的是,友好错误页和状态码是两件事,页面可以好看,但响应码必须真实,否则整站会多出无数软 404。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189