核心判断只有一句:HTTP 状态码描述的是请求处理结果,不是页面内容质量。错误页返回 200 时,要核对的是"内容语义"与"状态语义"是否矛盾,而不是单看某一个信号。可行的做法有两种——按内容语义修正状态码,或按状态码保留页面并改造内容——选哪种取决于这个 URL 是否还有真实的检索价值。
在动手改任何东西之前,先用能同时显示状态行和响应体的方式复查一次。命令行工具比浏览器更可靠,因为浏览器可能渲染缓存或插件注入的内容:
curl -I 只看响应头,确认状态行与 Content-Type。curl -s 抓完整响应体,确认正文里是否真的写着"页面不存在""已下架"这类语义。Accept-Language、User-Agent 的请求,排除按客户端返回不同结果的情况。如果响应头是 200,正文是错误提示,矛盾成立。如果响应头本身就是 404 或 410,那问题不在状态码,而在别处,不要继续按本文处理。这一步的实际动作是把状态行和正文各存一份文本,后续改动都以这两份为基准做前后对比。
适用条件是这个地址对应的内容已经永久消失,且没有等价替代页。此时让内容与状态一致的正确方向是改状态码,而不是改文案。
实施动作分三步。第一,在服务端或应用层让该路由返回 404(临时缺失)或 410(永久移除),并确保响应体仍是给人看的错误说明,而不是空白。第二,检查站内所有指向该 URL 的链接,把有效入口改到替代页;这一步决定后续是否还会持续产生无效请求。第三,改完后重新抓一次,确认状态行与正文同时变化。
代价要说清楚:改成 404 之后,如果这个 URL 仍有外部链接或用户收藏,访问者会看到错误页,转化路径中断。所以只有在确认没有替代内容时才这么做。另一个常见误区是拿 robots.txt 挡一下就算处理完了——robots.txt 只限制抓取,不等于可靠的索引移除,已经建立索引的地址仍可能出现在结果里,必须靠状态码和页面本身表达语义。
适用条件是这个地址承载的是聚合页、筛选页或长期有效的入口,只是当前参数组合下没有结果。此时把它改成 404 会误伤正常入口,正确方向是保留成功状态,把"空结果"改成有实质内容的页面。
实施动作:把原来的错误提示替换为解释性内容,例如说明当前筛选条件没有匹配项,并给出相邻的有效入口或放宽条件的建议。改造后重新抓取,核对三件事——状态码仍为 200、正文不再包含"不存在"这类语义、页面能通过站内链接抵达其他有效页面。
这个动作的结果直接影响下一步:如果改造后页面有了独立价值,就可以把它纳入站点地图并作为正常页面维护;如果改造后仍然只是空洞的提示,那说明它本质上还是错误页,应回到选择一。
同样是"错误页返回 200",成因不同,处理位置也不同:
区分方法很直接:对比不同类型错误 URL 的响应头是否一致,再对比正文是否一致。一致说明是统一兜底,不一致说明是逐条配置。这个判断决定你该改代码、改配置还是改路由,改错层的代价是问题反复出现。
假设某站点有一批已下架商品页,目前返回 200 加"商品已下架"文案。若判断这些商品没有替代品,按选择一处理:把路由改为返回 410,正文保留说明。改完后抓取该 URL,预期看到状态行 410、正文含下架说明、站内不再有指向它的有效链接。
若其中一部分商品有同类替代品,则按选择二处理:保留 200,把正文改成推荐替代品的列表,并加上指向替代品详情页的链接。验证时看的是状态行 200、正文不含"不存在"语义、页面能一跳到达有效内容。两种情况都用同一套核对项,区别只在预期值。这里的数字和站点都是假设,用于说明比较方法,不代表任何真实项目结果。
需要提醒的是,抓取量或某类请求数下降本身不能证明处理正确,它也可能来自抓取预算调整、外链变化或站点整体流量波动,必须结合状态码与正文的对应关系来判断。最后,改动上线后应重新抓取一次并保存前后两份响应,作为下一步是否继续调整的依据;若正文与状态仍然矛盾,说明改动没有落到真正返回响应的那一层。