当错误页面返回200时,先不要把它当成“状态码写错了”这种单点故障。更常见的矛盾是:响应头说成功,页面内容却在表达失败;或者页面模板确实是错误页,但基础设施把它包成了正常响应。核对一致性,要同时看响应状态、渲染后正文、以及错误是否由前端脚本或缓存层改写,三者对齐后才能决定是改服务端还是改边缘层。
第一种解释是服务端路由或异常处理逻辑把错误分支也写成了成功响应。此时页面正文通常仍带有“找不到”“已下架”“参数错误”等提示,只是状态码没有随内容变化。常见于自定义错误页、单页应用回退路由、或反向代理把上游错误统一改写成200。
第二种解释是内容层被替换,但状态码本身来自另一条链路。例如边缘缓存命中了一个旧的正常页面,而源站本次返回的是错误页;或者前端脚本在加载后才把错误提示插入DOM,爬虫拿到初始HTML时仍是成功页面的骨架。这两种情况的修复位置完全不同:前者要改源站异常处理,后者要改缓存键或渲染等待策略。
要区分上述解释,不能只看浏览器里看到的画面。浏览器可能已经执行脚本、读取缓存或展示回退内容。更可靠的做法是分别获取三层证据:
Content-Type、缓存相关头,以及是否存在重定向。若状态码为200但响应头带有明显的错误标记,说明源站知道出错但未正确表达。实际操作上,可以先对同一URL分别发起一次禁用脚本的请求和一次允许脚本的请求,比较两者正文是否相同。如果禁用脚本时正文为空或只有应用壳,而允许脚本后才出现错误提示,那么下一步应优先检查前端路由和渲染等待,而不是直接改服务端状态码。
假设某商品下架后,页面应返回404,但线上返回200。禁用脚本抓取时,原始HTML只有应用容器,没有“已下架”字样;允许脚本后,正文出现“该商品已下架”。此时有两种可能:一是服务端确实返回404,但边缘缓存把旧的200响应覆盖了;二是服务端始终返回200,由前端根据接口结果渲染下架提示。要区分,可以清掉该URL的缓存后再抓一次,并同时查看源站直接响应。如果清缓存后状态码变为404,问题在缓存层;如果源站直接响应仍是200,问题在服务端路由或前端回退策略。这个判断会直接影响下一步:前者要调整缓存键或缓存策略,后者要改异常分支的状态码输出。
如果错误页面本身内容正确,只是状态码错误,优先修状态码,因为状态码是爬虫判断页面是否可索引的第一层信号。如果状态码正确但内容被前端替换成错误提示,优先修内容层,因为此时状态码已经表达了失败,强行改状态码可能掩盖真正的前端路由问题。
还要注意,robots.txt的抓取限制不等于可靠的索引移除。即使你用robots.txt挡住错误页,已经抓取过的成功响应仍可能留在索引里。站点地图也不保证收录,它只能帮助发现URL,不能修正状态码与内容的不一致。若错误页涉及HTTPS,HTTPS本身也不保证安全无漏洞或排名,它只是传输层条件之一。不同搜索引擎对错误页和渲染的处理支持情况须分别核查,不能用一个引擎的表现推断另一个。
完成改动后,不要只验证目标URL一次。至少再用同一模板下的另一个错误页做对照,确认修复覆盖的是整类错误分支,而不是单个页面的特例。只有当状态码、原始HTML和渲染后正文三者对失败的表达一致时,才能认为这次核对完成,并据此决定是否继续处理索引层面的问题。