结论取决于错误页面的性质:如果它确实是“内容不存在”,正确做法是让服务器返回 404 或 410,并让响应体也表达“未找到”;如果它其实是“需要登录”或“暂时不可用”,返回 200 并渲染一段提示内容才是合理的。判断的关键不是状态码本身,而是状态码与响应体是否在说同一件事。两者矛盾时,先以响应体表达的真实语义为准去修正状态码,而不是反过来把提示文案改成“成功”。
内容不存在却返回 200,通常被称为软 404。它的代价是:搜索引擎可能把错误页面当成正常页面收录,用户从搜索结果点进来看到“找不到内容”,体验断裂。而登录墙、地区限制、临时维护页返回 200,是产品设计上的选择,不属于软 404。区分方法很简单:问一句“这个 URL 对应的资源,对普通访客来说是否真的存在且可访问”。答案是否定,就应当是非 200;答案是“存在但当前不可见”,200 才成立。
核对一致性时,不要只看头部,要同时读响应体。可以按下面的顺序做一次人工判断:
一个假设例子:某商品下架后,服务端仍返回 200,页面用 JavaScript 渲染出“该商品已下架”。从用户角度看信息是清楚的,但从状态一致性看,200 与“资源不存在”冲突。把服务端改为返回 410,并保留同样的提示文案,状态与内容就一致了。这个动作的结果是:后续再抓取时,抓取工具能直接依据状态码判断,而不必解析页面文字,下一步的日志核对也会更干净。
反例在这里:如果这个 URL 对应的资源确实存在,只是当前访客无权查看,比如需要登录的订单详情页,那么返回 200 并展示登录引导是合理的,改成 404 反而会误导——它会让搜索引擎和用户以为页面永久消失。此时要做的不是改状态码,而是确保提示内容明确、页面不被当作目标内容索引。也就是说,判断标准是资源是否存在,而不是“页面上有没有错误字样”。
第一,只看浏览器渲染结果。浏览器会把 JavaScript 执行后的页面呈现给你,但状态码来自服务端,前端改不了它。要拿到真实状态码,需要用命令行工具或抓取工具直接请求 URL,观察原始响应。
第二,把 robots.txt 当成补救手段。用 robots.txt 屏蔽错误页面,只能阻止抓取,不能可靠地移除已经收录的 URL,也不改变状态码与内容的矛盾。它解决的是“别再来抓”,不是“这个页面返回错了”。同理,站点地图里列出这些 URL 也不会让它们变成有效页面。真正要修的是服务端的状态码逻辑。
先选取一批已知会出错的 URL,逐个记录原始状态码和响应体中的关键语义,找出“内容说不存在、状态却是 200”的条目。对确认属于资源不存在的条目,在服务端改为 404 或 410;对属于权限或临时状态的条目,保留 200 但确认提示清晰。改完后重新请求同一批 URL,确认状态码与响应体语义一致,再决定是否需要提交移除请求或更新站点地图。这一步的意义在于:状态一致之后,后续的收录与移除判断才有可靠依据,否则任何基于状态码的统计都可能被错误页面污染。