要解决这个矛盾,不能只看 HTTP 状态码,也不能只看页面文字。正确做法是把“服务器实际返回的状态码”和“页面实际渲染出的内容”当成两条独立证据,分别采集,再判断它们是否指向同一个结果。若状态码是 200,但页面主体是“未找到”“已过期”“无法访问”这类错误文案,就属于典型的内容与状态不一致。
第一种解释是应用层把错误页当成了正常页输出。比如路由没有命中时,程序直接渲染了一个错误模板,但没有把响应状态改成 404 或 410,最终浏览器和爬虫看到的是 200。第二种解释是中间层覆盖了状态。比如反向代理、CDN 或重写规则先返回 200,再由后端输出错误内容,或者后端本来返回了 404,但被某条规则统一改成了 200。
这两种解释都表现为“内容像错误页,状态却是成功”,但处理位置不同。前者要改应用输出逻辑,后者要查代理、重写和缓存规则。
最直接的动作是用命令行分别请求原始源站和经过代理的公开地址,并只观察响应头中的状态行。假设源站返回 HTTP/1.1 404 Not Found,而公开地址返回 HTTP/1.1 200 OK,页面正文却相同,那么更可能是中间层把状态改写了。反过来,如果源站和公开地址都返回 200,正文却是错误文案,那么优先查应用层。
这个动作的结果会直接影响下一步:源站正常、公开异常时,不要急着改模板,而应检查代理规则、重写条件和缓存键;两边都异常时,才回到应用路由和错误处理逻辑。
不要只用浏览器肉眼判断。可以抓取响应正文中的关键标识,例如错误标题、空结果提示、重定向后的最终地址,再和状态码放在一起比较。一个可用的判断顺序是:
如果站点使用 JavaScript 渲染,还要确认错误内容是否由客户端脚本插入。此时初始 HTML 可能没有错误文案,状态码也可能在后续请求中才出现。需要分别记录初始文档响应和渲染后内容,避免把两种结果混在一起。
完成调整后,重新采集同一组地址的状态码和正文特征,而不是只打开首页看一眼。若原先源站 404、公开地址 200,修改代理规则后两者都返回 404,并且正文仍是错误页,这才说明状态与内容重新一致。若只把页面文案改成“正常”,但状态码仍是 200,问题并没有解决。
需要强调,robots.txt 的抓取限制不等于可靠的索引移除;即使错误页被 robots.txt 挡住,也不代表状态码错误可以被忽略。站点地图不保证收录,HTTPS 也不保证页面状态正确。不同搜索引擎对状态码和错误内容的处理方式可能不同,必要时应分别核查,而不是用一个平台的观察结果推断所有平台。
只有当状态码、正文内容和最终地址三者相互对应时,才能认为错误页面误返回成功响应的问题已经得到处理。