软 404 是一个容易被忽视的问题:用户和蜘蛛打开页面,看到的是“没有找到相关内容”或“该商品已下架”,但服务器返回的 HTTP 状态码却是 200。对搜索引擎来说,200 意味着页面有效、内容正常,于是可能继续抓取、继续保留,甚至反复回来确认。结果就是无效页面占用抓取预算,页面质量判断也被干扰。
软 404 和真实 404 差在哪里
真实 404 会明确告诉蜘蛛“这个地址没有对应内容”,蜘蛛通常会较快放弃,并逐步从索引中移除。软 404 则相反:内容已经不存在,状态码却还是 200,蜘蛛只能靠页面文字去猜,效率低且容易误判。严格来说,软 404 不是一种标准状态码,而是对“内容与状态码不一致”这类现象的统称。
常见的软 404 场景
- 空搜索结果页:站内搜索没有匹配结果,页面仍然返回 200,甚至被站内链接大量引用。
- 商品或文章下架:内容已删除,模板还在,页面显示“已下架”或只剩推荐位。
- 参数错误或筛选无结果:URL 参数组合后没有对应商品,页面照常输出 200。
- 分页超出范围:列表只有 5 页,访问第 99 页仍返回 200 和空列表。
- SPA 路由兜底:前端路由把未知路径都渲染成空壳页,服务器状态码统一是 200。
- 自定义 404 页配置不当:错误页本身做得不错,但服务器没有把状态码改成 404。
用几个动作做自查
- 随机抽取一批“看起来不该存在”的 URL,用 curl -I 或浏览器开发者工具查看 HTTP 状态码。
- 重点检查空搜索结果页、已下架内容页、参数筛选页、超出范围的分页。
- 查看服务器日志中返回 200 但内容为空或极短的页面,是否被蜘蛛频繁访问。
- 如果使用了前端框架,确认服务端渲染或预渲染时能否针对不存在的内容输出 404。
- 检查 CDN 或反向代理是否把 404 页面缓存成了 200,或者统一回源成 200。
修复时先分清“暂时”和“永久”
不是所有空页面都必须返回 404。关键是判断内容状态:
- 永久删除、下架且不再恢复:返回 404 或 410,让蜘蛛明确知道该地址已失效。
- 暂时无货、临时维护:可以保留 200,但页面上要给出清晰说明,并避免让蜘蛛把空模板当成正常内容。
- 参数筛选无结果:考虑返回 404,或 301 跳转到上一级有效分类页,减少大量无结果组合被索引。
- 分页超出范围:直接返回 404,比输出空列表更清晰。
- SPA 未知路由:让服务端对不存在的路径返回 404,而不是统一吐出应用外壳。
几个容易踩的坑
- 只在页面上写“404”三个字,状态码却不变,这仍然算软 404。
- 用 JS 判断内容不存在后才显示错误提示,但蜘蛛拿到的初始响应仍是 200。
- 把所有错误都 301 到首页,短期看似“不浪费权重”,长期可能被当成软 404 或跳转异常。
- CDN 缓存策略没有区分状态码,导致 404 页面被缓存,或 200 空页长期不更新。
状态码是蜘蛛理解页面的第一手信号。内容已经不在,就不要用 200 勉强支撑。
软 404 自查不需要一次全站翻新,可以先从模板和几类高频入口开始。把状态码与页面实际内容对齐,减少无效抓取,也让真正有价值的页面更容易被蜘蛛认真对待。定期抽查,比出了问题再补救更省事。