要取得可复查的状态证据,核心是让每一次死链判断都能被第三方按同样方法复现:记录请求的完整 URL、请求时间、HTTP 状态码、响应头、最终跳转地址和页面正文特征,并把这些信息保存成带时间戳的文件。只截一张“404 页面”的图不够,因为无法证明请求的是哪个地址、是否经过跳转、服务器返回的究竟是 404 还是 200 加一段错误文案。
开始抓取前,先把待查 URL 整理成表,至少包含来源页、链接所在位置、目标 URL、发现时间。判定口径也要提前写清楚:404 和 410 表示资源不存在;301、302 表示发生了跳转;200 只说明请求成功,不代表内容仍然有效。如果页面返回 200 但正文是“内容已删除”,它属于软 404,需要单独标记,不能直接算作正常页面。
同时确认检查范围。站内链接、站点地图中的 URL、外部入站链接指向的地址,可能得到不同结果。robots.txt 只限制抓取行为,不等于把页面从索引中移除;某个 URL 在 robots.txt 中被禁止抓取,也不代表它返回 404。站点地图列出 URL 同样不保证被收录。这些边界要在记录里写清楚,避免把“抓不到”误判成“死链”。
最关键的一步是保存原始响应,而不是只记录一句结论。可以用命令行工具对每个 URL 发起请求,并把响应头和状态码写入文件。下面是一个可执行的示例,假设要检查 https://example.com/old-page:
curl -sS -o body.html -D headers.txt -w "%{http_code} %{url_effective} %{time_total}\n" -L https://example.com/old-page
这条命令会保存响应头到 headers.txt、正文到 body.html,并输出最终状态码、最终 URL 和耗时。参数 -L 表示跟随跳转,因此输出的是跳转后的最终地址;如果要看第一跳的原始状态,应去掉 -L 再执行一次。两次结果都要保留,因为“原始 301”和“最终 200”是两种不同证据。
HTTP/1.1 或 HTTP/2 状态行、Location、Content-Type。如果 URL 数量较多,可以把结果整理成 CSV,每行一个 URL,列为:请求时间、原始状态码、最终状态码、最终 URL、响应头文件、正文文件、判定结论。判定结论只写“404”“410”“301 到有效页”“200 但疑似软 404”“超时待复查”等可核对的结果,不写“应该没问题”这类无法复查的描述。
拿到响应后,不要只依赖一次请求。可以从不同网络环境或不同工具再请求一次,比较状态码是否一致。如果第一次是超时、第二次是 404,应把两次都保留,结论写成“结果不稳定,需继续观察”,而不是直接定为死链。
对跳转链要逐跳验证。假设 A 跳 B、B 跳 C、C 返回 404,那么 A 本身不是最终死链,但整条链路已经失效。复查时应记录每一跳的状态码和 Location,确认是否存在循环跳转或跳转到无关页面。对返回 200 的页面,检查标题、正文首段和主要链接是否与预期内容一致;如果标题变成“页面不存在”,就按软 404 处理。
涉及索引状态时,要区分搜索引擎各自的支持情况。不同搜索引擎对 404、410、跳转和移除请求的处理并不相同,不能用一个平台的结果推断另一个平台。可以分别在对应搜索引擎的官方工具中查询,但工具显示“已移除”或“未收录”只是该平台的状态,不等于其他平台同步完成。
证据文件应按日期和批次存放,例如 2025-06-01/link-check/,并在批次目录中放一份说明,写明检查范围、请求命令、判定口径和执行人。这样过一段时间后,任何人拿到目录都能重新执行同样的命令,比较状态是否变化。
复检频率取决于链接变更频率。导航、商品下架、文章迁移较多的站点,可以缩短复检间隔;长期稳定的页面可以拉长。复检时重点看三类变化:原本 404 的 URL 是否恢复 200;原本 301 的 URL 是否变成 404;原本 200 的 URL 是否变成软 404。每次复检都生成新批次,不覆盖旧文件,否则就失去了“可复查”的意义。
如果确认是死链,下一步是决定处理方式:能恢复内容就恢复,能跳到最相关的新页面就设置 301,确实不再存在的资源可以保留 404 或 410。无论选哪种,都要在证据表中记录处理时间和处理后的再次请求结果,形成从发现到验证的完整闭环。