当错误页面返回 200 而不是 404 或 410 时,单看一个样本往往看不出问题,因为浏览器和抓取工具都会把它当成正常页面。核对的关键是同时检查两件事:HTTP 状态码和页面实际内容是否表达同一含义。如果状态码说“成功”,而正文说“不存在”,两者就不一致,需要按站点层级定位是模板、路由还是服务器配置造成。
错误页面误返回成功响应,通常有两种成立条件,处理方式完全不同。
两种条件的区别不在于数量本身,而在于返回内容是否有“错误”语义。页面级误判里内容承认不存在,只是状态码错了;站点级误判里内容也变成了正常页面,状态码和内容一起偏离。判断时不要只看一个样本,要抽多个路径比较。
建议按下面顺序操作,每一步的结果都会影响下一步。
这个动作的结果决定下一步:如果例外集中在某一目录,优先检查该目录对应的路由或模板;如果全站随机分布,优先检查服务器默认配置和重写规则,而不是逐页修改内容。
假设某站点在 /blog/ 下随机不存在的路径返回 200 且正文为“文章不存在”,但 /product/ 下同样不存在的路径返回 200 且正文是商品列表。前者的状态码错,内容对;后者的状态码和内容都错。此时不能把两者当成同一个问题处理。
对 /blog/,可以检查该目录的模板是否在渲染错误提示时没有同步设置响应状态;对 /product/,要检查是否配置了兜底路由,把未匹配请求重定向到列表页并返回 200。修复后再次请求同一组样本,确认状态码与正文语义一致,才算完成核对。这个例子是假设,用于说明比较方法,不代表任何真实站点的现状。
即使样本状态码改成了 404,也不能仅凭一次请求就断定全站一致。以下情况需要单独核查:
如果请求量或抓取量在修改后归零,也不能单独证明修复正确。归零还可能来自抓取预算调整、服务器暂时不可达、robots.txt 变更或统计口径变化。正确的做法是回到状态码与正文语义的比对,用同一组样本复测,并记录修改前后的差异。
单个样本成立,不代表可以把这个样本的处理方式复制到全站。规模化核对时,先按路径类型分组:静态文件、参数页面、已删除内容、从未存在的路径。每组抽若干样本,分别记录状态码和正文语义。只有同一组内多数样本表现一致,才可以把该组的处理规则推广到同类路径;如果组内出现例外,先解释例外原因,再决定是否扩大修改范围。
实际动作上,可以先把确认不一致的路径整理成清单,标注所属目录、返回状态和正文语义,然后交给负责路由或服务器配置的人处理。处理完成后,用同一清单复测,确认状态码与正文语义一致,再考虑是否需要通过站点地图或其他方式表达页面状态。这个顺序能避免在原因未明时批量改动,也能让每一步的结果决定下一步的范围。