同一份正文,如果一台服务器返回 200 OK,另一台返回 410 Gone,那么“这个页面是否已经失效”这件事就不再是内容问题,而是响应头问题。对死链处理来说,判断依据应当是响应头,而不是页面里是否还看得到文字。先确认哪一层在决定状态码,再决定是修链接、保留页面还是做移除处理。
第一种解释是:内容确实还在,只是被错误地配上了失效状态。常见于反向代理、CDN 缓存、旧站迁移脚本或多环境发布:源站文件仍可读,但边缘节点或规则层先返回了 410、404 或 301。此时页面正文相同,并不代表 URL 仍然有效。
第二种解释是:内容虽然相同,但该 URL 已经被有意标记为失效。比如同一篇文章迁移到新路径后,旧路径仍保留一份副本用于人工查看,但服务端明确返回 410,表示不再提供该资源。这时“内容相同”只是镜像或备份现象,不能推翻失效判断。
两种解释的差别不在正文,而在谁有权决定这个 URL 的当前状态。若把内容当作唯一证据,团队很容易得出相反结论:内容编辑认为页面还在,不该删;技术侧认为响应头已经说明失效,应继续处理。
先做一次带响应头的请求,而不是只看浏览器渲染结果。重点核对:
HTTP/1.1 或 HTTP/2 后面的状态码,以及它是否来自最终响应而非中间跳转。Location 是否存在,以及它指向的新地址是否与当前内容一致。Cache-Control、Age、Via 等字段,判断是否命中了缓存层或代理层。Last-Modified 与正文中的更新时间是否矛盾。如果同一 URL 在直连源站与经过 CDN 时状态码不同,优先怀疑中间层。如果直连源站也稳定返回失效状态,则更可能是源站规则或发布配置在起作用。这个动作的结果会直接影响下一步:是清缓存、改规则,还是按真实死链处理内链和外链。
假设某站点把旧文章目录整体设为 410,但运维为了排查,又在同路径下保留了一份静态副本。此时用浏览器直接打开,仍能看到完整正文;用带响应头的请求检查,却得到 410 Gone。若团队只依据“页面能打开”就恢复旧链接,实际会把用户和抓取引向一个已被明确标记移除的地址。更稳妥的做法是:先确认该 410 是否为有意配置,再决定是否将旧链接改到新地址,而不是因为正文可见就撤销失效状态。
当多个角色对同一事实理解不同时,不要继续争论“页面还在不在”。把问题拆成可核对项:
这样处理的好处是,后续无论是修改内链、提交移除还是保留观察,都有同一份事实基础。若状态码来自缓存层,修正配置后应重新取样确认;若来自源站,则按死链处理流程继续。注意,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录,这些都不能替代对响应头的核对。
响应头优先于正文,但前提是请求确实到达了最终响应,而不是被跳转、缓存或错误配置截断。对于需要登录、按地区返回不同内容或依赖客户端渲染的页面,单次请求可能不足以代表所有访问路径。此时应至少核对两种网络条件,并记录差异。只有把“谁返回了什么状态、在什么条件下返回”说清楚,死链处理才不会在内容与响应头之间反复摇摆。