先给结论:状态码是服务器对“这次请求是否成功处理”的表态,页面正文才是用户和爬虫真正看到的内容。两者不一致时,不要只看一个信号就下判断,而要把同一URL的响应头、正文特征和渲染结果放在一起比对。下面以你手上的一个错误页面为对象,给出可执行的处理顺序。
很多误判来自样本不对等。你可能在浏览器里看到“页面不存在”,但用命令行请求同一URL时返回200;也可能反过来。先固定以下条件再谈一致性:
www、是否带结尾斜杠、是否带查询参数。User-Agent和Accept-Language,避免被差异化返回干扰。动作上,先用一种方式记录原始响应,再换第二种方式请求同一URL,比较两者是否指向同一份内容。如果两次请求本身就不同,后面的“状态与内容不一致”结论不成立,下一步应改为排查缓存、CDN或服务端路由,而不是改状态码。
“看起来像错误页”不是证据。你需要提取几个稳定特征,才能判断正文是否真的在表达错误:
假设一个页面返回200,但标题是“页面不存在”,正文只有一句提示加一个返回首页链接。这组特征说明:服务器认为自己成功处理了请求,但正文表达的是“目标内容不可用”。此时要核对的是路由层为什么把不存在的路径交给了错误模板,并仍然输出200。
内容与状态不一致,常见有两种方向,处理方式完全不同:
区分方法:检查该URL在站内是否还有有效入口、是否有对应的数据记录、是否在正常导航中可达。如果数据存在且可访问,却因为模板渲染失败而显示错误文案,那要修的是渲染逻辑;如果数据本就不存在,才应让服务器返回合适的错误状态。
建议按以下顺序推进,避免同时改多处导致无法归因:
比如第3步发现数据不存在,那么第4步就是重点:确认错误处理分支是否显式设置了状态码。如果该分支只渲染模板而未设置状态,返回200就属于实现遗漏。修好这一处后,再重新请求同一URL,确认状态码与正文语义同时指向“不存在”,这才算一致。
状态码改对不代表问题彻底关闭。还要确认:
最后回到你最初的对象:把修复前后的响应头、正文特征和请求条件并列保存。如果状态码与正文语义已经一致,且入口、站点地图和抓取限制都已分别核对,这个不一致问题才算处理完成;否则下一步应针对仍未对齐的那一项继续排查。