核对的核心不是“状态码是多少”,而是让返回给抓取端的状态码、页面正文和最终去向三者互相印证。当错误页返回 200 时,先取一份原始响应,逐项比对状态行、正文特征和跳转链,再决定是改服务端、改模板,还是只改边缘规则。样本成立但规模化后出现例外,往往说明触发条件不止一种,必须按页面类型分开处理。
同样是错误页返回 200,成因可以完全不同,处理位置也不同。
HTTP/1.1 200 OK。这类问题要在业务代码或模板层修,让不存在、已删除、无权限三类情况分别返回 404 或 410,而不是统一渲染成正常页面。error_page 改写、状态码强制覆盖或兜底路由。判断依据很简单:拿源站访问日志与抓取端实际收到的响应头对照。如果源站记录 404、抓取端收到 200,问题在中间层;如果源站本身就记录 200,问题在应用逻辑。这个区分决定了下一步动作,也决定了谁来改。
浏览器会执行脚本、跟随跳转、套用缓存,看到的结果不足以作为核对依据。需要取的是接近抓取端的原始响应。
Location、Content-Type、Cache-Control 和 Vary。完成这一步后,你手上应该有:一条状态行、一份正文、一条跳转链。接下来才是判断一致性。
三者必须同时自洽,缺一项就不能算核对通过。
Location,或返回 404 却仍输出完整正文,都会让抓取端对页面性质判断混乱。软 404 与硬跳转混用是常见来源。实际操作中,可以把每个样本按“状态码 / 正文特征 / 最终去向”三列记录,逐条比对。记录本身不是目的,记录的作用是暴露哪些页面属于同一类异常,从而决定是批量修还是逐个修。
单个样本修好后,批量扫描常会冒出例外。常见原因有三类:
因此,样本结论只能作为缩小范围的线索,不能当作全站结论。批量核对时,应按页面类型和访问路径分组抽样,而不是随机抽样。分组后如果某一组例外集中,优先查该组的模板或路由,而不是回到服务端全局规则。
假设某网店有一批已下架商品 URL,修复目标是让它们返回 404 而不是 200。修复后抽查 20 条,其中 15 条返回 404,5 条仍返回 200。此时不应直接判定“修复失败”,而应先看这 5 条是否属于同一类:如果它们都带旧参数或来自站内旧链接,问题可能在参数处理或跳转规则;如果它们分散在不同类目,则更可能是模板分支未覆盖。
这个例子的意义在于:先分类,再判断修复是否生效。分类动作会直接改变下一步——是继续改代码,还是只调整边缘规则,或是补一条重定向。若跳过分类直接全量重扫,很可能得到一批看似矛盾、实则成因不同的结果。
修复完成后,需要重新取样并对比修复前的记录,而不是只看单次请求。核对通过的标志是:同一批 URL 的状态码、正文特征、最终去向在多次请求中保持一致,且与页面真实性质相符。
需要提醒的是,抓取量或某项统计归零,并不能单独证明处理正确。它也可能是抓取预算调整、站点整体抓取减少或缓存命中变化导致的。同理,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录,这些都不能替代对响应本身的核对。只有在状态、正文、去向三者稳定自洽之后,才能把结论用于下一步的批量处理或提交动作。