先给结论:错误页面返回 200 时,不能只看状态码就认为一致,也不能只凭页面文字判断。正确做法是把“客户端收到的状态码”“页面主体是否属于错误模板”“该 URL 是否应被索引”三件事分开核对,再决定保留、改写还是退出。最容易被忽略的是:200 只说明请求被成功处理,不说明页面内容有效。如果软 404 长期存在,爬虫会把它当作正常页面持续抓取,而真正的错误页却占用抓取预算。
第一种做法是保留 200 并改写内容:把错误页改成有实际价值的说明页,比如“该商品已下架,以下是同类替代”。它适合 URL 本身仍有搜索需求、且你能提供真实替代内容的场景。代价是你必须持续维护这些页面,否则它们会变成低质量聚合页。
第二种做法是退出索引并返回正确状态:对确实不存在的 URL 返回 404 或 410,对已永久迁移的 URL 返回 301。它适合内容已彻底消失、没有替代价值的场景。代价是短期内这些 URL 的抓取和展示会下降,若误判了仍有需求的页面,等于主动放弃入口。
判断依据不是“哪个更安全”,而是这个 URL 对应的资源是否还应该存在。资源存在但内容变了,用 200 加改写;资源不存在,用 404/410;资源换了地址,用 301。把这三类混在一起,才会出现状态码与内容不一致。
用 curl -I 或浏览器开发者工具的 Network 面板看首字节响应。重点不是只看 200,而是同时看 Content-Type 是否为 text/html,以及是否存在 X-Robots-Tag: noindex。如果错误页返回 200 且没有 noindex,它就可能进入索引候选。这里要说明一个常见误解:robots.txt 的抓取限制不等于可靠的索引移除,被 robots.txt 阻止抓取的 URL 仍可能因外部链接出现在索引中,只是摘要可能缺失。
打开页面源码,确认它渲染的是错误模板还是正常内容模板。如果标题、正文、面包屑都来自“未找到”逻辑,但 HTTP 状态是 200,这就是典型的软 404。此时不要只改状态码,要先确认该 URL 是否真的没有对应资源。若 CMS 把“无结果”也渲染成列表页,状态码和内容会继续分离。
如果错误 URL 仍在站点地图里,等于你一边告诉爬虫“这是重要页面”,一边让它看到错误内容。但要注意:站点地图不保证收录,移除站点地图也不等于移除索引。它只能作为一致性核对的一环,不能单独作为处理依据。
假设某站有 500 个商品 URL,因库存系统改造,其中 120 个已下架。改造后这些 URL 全部返回 200,页面显示“商品不存在”。此时有两种处理:
动作与结果的关系是:先抽样 10 到 20 个 URL 用 curl 核对状态码与页面标题,如果标题全是“商品不存在”而状态码全是 200,说明是模板层问题,应优先修模板而不是逐页改。修完模板后再抽样复核,如果状态码变为 404 但页面仍渲染替代推荐,说明你误把“有替代品”的页面也退出了,需要回滚这部分 URL。
保留 200 的条件:URL 有稳定搜索需求,页面能提供与原始意图一致的真实内容,且你能承担长期维护成本。若只是把错误信息换个说法,不构成保留理由。
改写为 301 的条件:新旧 URL 存在一对一的主题对应关系,且新页面内容能承接原意图。若只是跳到首页或分类页,属于软 404 的变体,不应使用 301。
退出为 404/410 的条件:资源确实不存在,没有等价替代,且该 URL 没有大量高质量外链指向。410 比 404 更明确,但两者对爬虫的最终效果接近,不必为了“更快”而强行用 410。
最后提醒一点:HTTPS 不保证安全无漏洞或排名,它和状态码一致性无关。不同搜索引擎对软 404 的处理节奏和支持情况须分别核查,不要用同一套预期套所有爬虫。核对完成后,把处理规则写进模板层,而不是逐页手工修,否则下一次内容变更会再次产生同样的不一致。