先给结论:不要一发现不同节点返回的版本不一致就判定死链,而要先固定一个可复现的请求,把“谁返回了哪个版本”记录成证据,再逐层剥离缓存。只有当同一资源在绕过某层缓存后仍返回404或410,才把它当作真正的死链问题处理。
假设你的站点在CDN、反向代理和CMS插件三层都有缓存。某天用死链测试工具扫描,同一批URL在两次运行中结果不同:一次报告某产品页是404,另一次显示200。运营看到报告后准备直接删链接,但这时真正要问的不是“它是不是死链”,而是“为什么同一地址会返回不同版本”。
多层缓存下,不同节点可能持有不同时间的副本。CDN边缘节点可能保留旧版本,反向代理可能刚被刷新,而源站因为发布流程只更新了一部分内容。死链测试工具看到的是它请求那一刻、经过那一条路径后拿到的响应,而不是全站唯一真相。因此第一步是把工具结果当作线索,而不是判决。
要让定位有意义,必须让每次请求尽量可比。具体动作是:选定一个出问题的URL,记录完整请求路径、请求头中的缓存相关字段、响应状态码、响应中的缓存标识,以及响应体的关键片段。然后用同一条件连续请求多次,观察结果是否稳定。
这个动作的结果会直接决定下一步:可复现的差异才值得继续追缓存层;不可复现的差异应先检查测试工具本身的请求方式、并发和超时设置。
确认差异可复现后,按“从外到内”的顺序剥离缓存。假设站点结构是CDN→反向代理→应用服务,可以依次做三组请求:
如果只有CDN层返回404,而反向代理和源站都返回200,那么问题在CDN缓存了旧错误,而不是资源真的消失。此时应推动刷新对应缓存,并确认刷新后同一路径是否稳定返回200。反之,如果源站本身就返回404,那么无论缓存怎么处理,都不应把它当成缓存假象,而应回到发布和路由配置排查。
这里要说明一个适用条件:绕过缓存的操作需要你有权限直接访问内层服务,或至少能通过受控方式验证。如果没有这个前提,只能先收集各层响应头,不能贸然断定是哪一层的问题。
两种情况的证据不同,处理动作也不同。可以用下面的对照来判断:
如果证据同时指向两边,比如源站返回404但CDN仍返回200旧页面,那么这是两个问题叠加:源站已经删了资源,但CDN还在提供旧副本。此时应先处理源站的真实死链,再单独刷新CDN缓存,不能只做其中一步就认为解决。
定位到具体层之后,动作要落到可验证的结果上。假设确认是反向代理缓存了旧404,那么刷新该层缓存后,用同一请求条件重新验证;如果返回200且持续稳定,才把该URL从死链清单中移除。假设确认源站确实返回404,那么应保留该记录,按真实死链流程处理重定向或删除内链,而不是反复刷新缓存。
最后提醒一点:死链测试工具的扫描结果受请求路径、缓存状态和扫描时点影响。请求量或抓取量下降、某次扫描报告为空,都不能单独证明问题已消失,还需要结合源站响应和缓存刷新记录一起看。只有把“哪一层返回了什么”固定成可复查的证据,多层缓存下的一致性定位才不会变成反复猜测。