结论分两种情况:如果错误页面对外返回的是 200,而页面正文明确写着“不存在”“已下架”一类语义,那么内容与状态已经不一致,应把状态码改成与语义匹配的响应;如果返回 200 且正文本身是有效内容,只是被误判为错误页,那要改的是判断规则而不是状态码。判断依据不能只看抓取工具显示的一行状态,而要把响应头、渲染后正文、跳转链和站点地图声明放在一起比对。
多人协作时最容易出现的分歧,是有人看响应头说“是 200,没问题”,有人看页面说“这是 404 内容,有问题”。两者都没错,只是看的层面不同。核对时先把事实拆成三类:
把这三类分开之后,分歧就从“谁说得对”变成“这条地址落在哪一类”,可以直接用证据归类。
用命令行工具请求目标地址,记录状态码和跳转历史,例如 curl -I 只看头部,curl -IL 跟随跳转并逐条列出。重点看两件事:最终落点的状态码是什么,中间是否经过 301、302 或多跳。如果错误页经过软跳转落到一个 200 的首页,那么对外呈现的状态与正文语义仍然是不一致的。
错误提示有时由前端脚本注入。原始 HTML 里可能没有“不存在”字样,渲染后才出现。因此要分别保存原始响应正文和渲染后正文,确认错误语义出现在哪一层。这一步会直接决定修复位置:若错误文案来自服务端模板,改模板与状态码;若来自前端脚本,先判断是否应该由服务端直接返回错误状态。
如果站点地图或站内链接仍在推荐这个地址,那么即使状态码正确,入口层面仍存在矛盾。站点地图不保证收录,但把错误地址写进站点地图,等于向抓取方声明它是有效内容,这与错误页语义冲突。处理方式是先移除声明,再观察抓取行为变化。
记录格式建议包含:地址、请求时间、状态码、跳转链、渲染后是否含错误语义、该地址出现在哪些入口。同一份记录交给不同角色,大家看的是同一组事实,而不是各自的印象。
假设某地址正文写着“内容已下架”,服务端已改为返回 410。看起来状态与语义匹配了,但如果站内导航、站点地图和外部链接仍大量指向它,用户和抓取方依然会持续到达这个地址。此时“内容与状态一致”只在单次响应层面成立,在入口层面仍不一致。这个反例说明:状态码修复只解决响应层,入口清理是另一件事,两者不能互相替代。
先选一个代表性地址,完成上述四项记录,然后按记录归类:属于状态与语义冲突的,改服务端响应;属于入口错的,清理声明与内链。改完之后,对同一地址重新抓一次响应头和渲染后正文,确认状态码、跳转链、正文语义三者指向同一结论。如果重新抓取时状态码已变但正文仍是旧缓存内容,说明还有一层缓存或模板未同步,下一步应查缓存与模板链路,而不是继续改状态码。只有三者一致,这条地址才算核对完成,才可以进入下一批地址的批量核对。