先给结论:状态码只能说明服务器“声称”这次请求成功了,不能证明页面内容仍然有效。当你要让一批旧内容、旧系统或旧合作关系退出时,如果错误页被配置成返回 200 OK,死链接检测就会把它当成正常页面放过。核对方法是把“响应状态”和“可见内容”当成两条独立证据,分别取样、分别判定,再决定是删除、重定向还是保留。
常规检测工具大多只读取响应头里的状态码,看到 200 就记为通过,不会去解析正文。软 404 正是利用这一点:服务器对不存在的资源返回 200,同时把“页面不存在”“内容已下架”之类的提示渲染在正文里。对爬虫和检测脚本来说,这和一个正常文章页没有区别。
还有一种更隐蔽的情况:旧系统保留了通配路由,任何未匹配的路径都会落到同一个兜底模板上,模板本身返回 200,正文却只有一句道歉文案或一段空白。此时链接在技术上“可访问”,在用户和搜索引擎眼里却已经是废页。你要处理的不是链接是否连通,而是这个连通是否有意义。
不要只测首页或几个代表链接。对你手里这批待退出的资料,逐个或分批取出两类证据:
可以用命令行工具对单个地址取样,把响应头和正文分开看:
curl -I https://example.com/old-page 只看头部,确认状态码;curl -s https://example.com/old-page 看正文,确认里面是不是错误提示。两者结果不一致,就是软 404 的信号。
这一步的实际动作是:把状态码和正文各存一份,标注取样时间。结果会直接影响下一步——如果状态码是 200 但正文是错误提示,就不能按“正常页面”处理,而要按“已失效内容”处理。
状态与内容对不上,通常有几种不同成因,处理方式也不同:
区分办法是横向比对:随机取几个确定不存在的路径,看它们返回的正文是否和你怀疑的页面一致。如果一致,说明是兜底逻辑在起作用,而不是这个页面本身还有价值。
确认页面已失效后,退出方式取决于内容是否还有替代价值:
这里有一个假设例子说明比较方法:假设你有 50 个旧合作页面,其中 30 个正文只剩一句“合作已结束”,另外 20 个仍有可读的说明文字。前者适合退出,后者可以先保留观察。这个划分依据是正文信息量,不是状态码,因为两者的状态码可能完全相同。
需要提醒的是,robots.txt 的抓取限制不等于可靠的索引移除,它只约束抓取行为,不保证已收录地址从结果中消失;站点地图也不保证收录。如果目标只是让用户不再看到废页,处理服务器响应和正文就够了;如果还涉及索引层面的清理,需要另行核查各搜索引擎的支持情况。
改动上线后,重新对同一批地址取样,重点看两件事是否同时变化:状态码是否变为预期的结果,正文是否不再出现错误提示。只变其中一项,说明问题没有真正解决。
复查时还要注意一种误判:请求量或抓取量下降,不能单独证明处理正确。它也可能来自抓取预算变化、外链减少或检测频率调整。要结合正文样本一起判断,而不是只看某一个数字归零。
最后,把每个地址的“原状态、现状态、正文判定、处理动作”记在同一份表里。这样下一次遇到状态与内容不一致时,你能直接对照上次的判定逻辑,而不必重新猜测兜底模板的行为。核对内容与状态的一致性,本质上是让每一条退出决策都有两条独立证据支撑,而不是只信服务器返回的那一个数字。