先给结论:当同一URL在不同缓存层返回的404版本不一致时,不要急着统一改成410,也不要立刻全站回滚。先确认“不一致”发生在哪一层、是否影响真实用户与抓取,再决定保留现状、改写响应还是退出该URL。判断依据是缓存键、TTL与回源行为,而不是某个层单独返回了什么。
多层缓存里出现不同版本,常见原因有两类。第一类是版本差异:源站已经改了404页内容或状态码,但边缘节点、CDN、反向代理仍缓存旧响应。第二类是缓存键差异:不同层对URL的规范化不同,比如是否保留查询串、是否区分大小写、是否把尾斜杠视为同一资源,导致它们各自命中不同缓存对象。
区分方法很直接:对同一URL分别请求源站、反向代理和边缘节点,记录状态码、响应头和缓存命中标识。如果源站返回404而边缘返回200,属于版本差异;如果源站和边缘都返回404但响应体不同,更可能是缓存键或内容协商差异。只有先分清这两类,后续的保留或改写才有意义。
保留是指维持当前多层返回不同版本的状态,不做统一处理。它成立的前提通常是:不一致仅出现在内部缓存层,真实用户和抓取工具看到的版本一致;或者差异只影响响应体中的推荐链接,不影响状态码本身。
此时可以保留,但必须做一件事:确认缓存TTL和刷新机制是否会在可接受时间内收敛。如果边缘节点的TTL很长,而源站已经删除该URL,那么保留等于让旧404页继续存在。判断动作是记录各层的TTL与最后刷新时间,若收敛时间超出业务可接受范围,保留就不再成立。
改写是指统一各层返回的404状态码与响应体,但不退出该URL。它适用于:URL本身仍有价值,只是内容已迁移或暂时不可用;或者多层差异来自缓存键配置错误,需要修正规范化规则。
改写的实际动作是先在源站确定唯一响应,再逐层清理或刷新缓存,最后验证各层返回一致。这里要注意,robots.txt的抓取限制不等于可靠的索引移除,即使你阻止抓取,已收录的404页面仍可能保留在索引中。改写响应不会自动解决索引问题,它解决的是缓存层不一致。
退出是指确认该URL不再需要,统一返回404或410,并接受多层缓存逐步收敛。它适用于:URL对应的内容已永久删除,且没有迁移目标;或者多层不一致已经导致用户看到错误页面,继续保留会放大问题。
退出的关键不是改状态码,而是确认没有其他层在回源时重新生成该URL。如果源站已删除,但某一层缓存仍能命中旧响应,退出只是名义上的。实际动作是检查各层是否还有回源规则会重建该URL,若有,先移除规则再统一状态码。退出后,站点地图不保证收录,也不保证移除,收录状态需要单独观察。
假设某URL在源站返回404,反向代理返回404但响应体是旧版,边缘节点返回200。此时不要直接选退出。先看边缘节点的200来自哪里:如果来自边缘自身缓存,且TTL还有数小时,那么保留或改写都取决于业务能否等待;如果来自回源规则把404改写成了200,那么问题在规则层,退出无效,必须先改规则。
这个例子的数字仅用于说明比较方法,不代表任何真实项目的缓存时间。判断顺序始终是:先定位差异层,再确认收敛时间,最后才在保留、改写、退出之间选择。
无论选择哪种处理,下一步都要验证各层是否真正一致。验证动作包括:对同一URL分别请求各层,记录状态码与响应体;检查缓存键是否包含查询串和大小写;确认TTL与刷新是否按预期生效。如果验证发现某一层仍返回旧版本,说明处理没有覆盖该层,需要回到定位步骤,而不是继续改状态码。
只有当各层返回一致,且真实用户与抓取工具看到的结果符合预期,这次处理才算完成。否则,保留、改写或退出都只是局部动作,问题会以另一种形式再次出现。