先给结论:不要从“哪一层缓存坏了”开始查,而要固定一个可复现的请求标识,逐层比对同一标识返回的响应头、正文指纹和缓存键。多数多层缓存不一致不是某一层配置错误,而是各层对Vary、查询串、Cookie、设备或地理规则的归一化方式不同,导致同一个URL在不同层命中不同副本。下面用一个假设情境串起判断过程。
假设某站有CDN、反向代理和页面缓存三层。运营发现:办公网访问文章页A是旧标题,手机热点访问是新标题;清空浏览器缓存后仍复现,搜索引擎抓取工具返回的正文与旧标题一致。常规做法——刷新CDN、清空页面缓存、重新提交站点地图——都做过,问题仍间歇出现。此时要把它当作一致性问题,而不是收录失败本身。
第一步动作:选一个稳定URL,加上不会改变内容的调试参数(如?cache_probe=1),分别从办公网、手机热点和一台云主机请求,记录响应头中的Age、X-Cache、Vary、ETag和正文前若干字节的哈希。结果若显示不同网络命中不同X-Cache状态,说明缓存键或分流规则在层间不一致,下一步应查缓存键,而不是继续清缓存。
多层缓存下,“同一个URL”并不等于“同一个缓存键”。常见差异来源包括:
?a=1&b=2与?b=2&a=1视为同键,另一层视为不同键。Vary头一层按Accept-Encoding分桶,另一层还加入User-Agent或Cookie。验证方法:对同一URL构造两组只差一个维度的请求,比较响应头中的缓存命中标记和正文哈希。若只有加入某个请求头后才出现版本分叉,该请求头就是候选缓存键维度。把候选维度写进排查记录,再决定是统一各层规则,还是在入口层剥离无关维度。
缓存层返回不同版本,也可能是源站本身在滚动发布或A/B测试。可区分证据如下:
ETag或正文哈希不同,但绕过所有缓存直连源站返回稳定版本,问题在缓存键或缓存副本。Age很大且各层差异明显,说明旧副本被不同层长期保留,需检查各层TTL和清除传播。这一步的结果决定下一步:源站不一致时,先修发布流程和数据同步;缓存键不一致时,先统一各层缓存键与Vary规则,再谈清除。
假设排查确认是CDN层与反向代理层对Vary: Accept-Encoding处理不同。动作可以是:在入口层统一缓存键,只保留URL路径、必要查询参数和内容编码维度;对带用户态Cookie的请求直接回源不缓存。执行后,重新用同一组探测请求比对响应头和正文哈希。
验证要看三件事:同一缓存键的正文哈希是否收敛;X-Cache状态是否可解释;源站日志中同一路径的请求量是否出现合理变化。注意,请求量或抓取量归零不能单独证明处理正确,它也可能是探测参数被剥离、日志采样或抓取工具更换所致。只有正文哈希和缓存命中标记同时收敛,才能进入下一步——观察搜索引擎抓取工具返回的正文是否与用户可见版本一致。
多层缓存不一致会让抓取工具和用户看到不同正文,但它不直接等于收录失败。robots.txt的抓取限制不等于可靠的索引移除;站点地图不保证收录;HTTPS也不保证安全无漏洞或排名。若版本一致后仍未收录,再按抓取、索引、展示分层排查,而不是继续清缓存。
一个可操作的收尾动作:把本次探测用的URL、请求头组合、各层响应头摘要和正文哈希写入排查记录。下一次出现版本分叉时,先用同一组探测复现;若无法复现,优先检查探测参数是否被某一层剥离或归一化。这样做的结果是,你能把“缓存不一致”从“收录失败”里拆出来,避免把清除动作当成结论。