这类问题我又碰上了一次。Nginx 里配了 error_page 404 /index.html,本意是不让用户看到错误页,结果所有死链都返回 302 到首页,搜索里多出几百个重复首页。

第一反应是「站内旧链接指向的地址全部变成软 404」,验证下来不成立。

这类报错背后常见的原因有几处,逐个排除就行。error_page 内部跳转后状态码变成 200 或 302,404 信号丢失;蜘蛛把跳转后的首页当成原地址的内容,重复度极高;跳转没有保留原地址参数,日志里看不出原始请求。

请求一个不存在的地址看返回码

curl -sI https://www.example.com/no-such-page | head -3

然后确认 error_page 的配置位置

nginx -T | grep -n 'error_page'

随后改回返回真实 404 并保留友好页

error_page 404 /404.html;

复查状态码

curl -s -o /dev/null -w '%{http_code}\n' https://www.example.com/no-such-page

恢复的判定其实很直接。不存在的地址返回 404 且页面有导航和搜索框,GSC 里软 404 的条目转为正常的未找到,重复首页的收录逐步清理。

友好错误页和隐藏错误是两件事,前者保留 404 状态码,后者让蜘蛛以为页面存在,改起来只差一行配置。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189