先给一个可操作的结论:当同一 URL 在不同层缓存中返回不同版本时,不要急着把差异归因于索引异常,而应先用带随机参数的请求对比各层响应头与正文指纹,确认差异出现在哪一层。如果差异只出现在边缘节点而源站一致,问题更可能在缓存策略;如果源站本身就不稳定,则百度收录情况查询看到的版本差异只是结果,不是原因。缺少日志权限时,你仍可用公开响应头、正文摘要和抓取时间戳完成最小定位,但不能据此断定百度已收录或未收录哪个版本。
多层缓存下最容易误判的一步,是把不同请求时间、不同 UA、不同 Cookie 得到的响应直接对比。假设你从 CDN 节点、反向代理和源站各取一次响应,正文长度分别是 18KB、18KB、21KB,这不一定说明源站多了一段内容,也可能是源站那次请求命中了未压缩版本,或触发了动态渲染分支。要减少这种噪声,固定请求条件:同一路径、同一查询串、同一 UA,只改变发起位置;记录每层的 Age、Cache-Control、ETag、Last-Modified 和正文的哈希值。
如果哈希值分层一致、只有 Age 不同,说明内容版本一致,只是新鲜度不同,这种情况通常不会造成收录版本分裂。如果哈希值分层不同,再进入下一步。这里有一个反例会让“分层定位”失效:当源站对同一 URL 做 A/B 分流时,即使所有缓存层都正确,你也会看到不同版本,因为差异来自应用层而非缓存层。判断方法是重复请求同一层多次,若同一层内部就出现多个版本,缓存不是唯一变量。
响应头比正文更容易暴露责任层。可以按下面的顺序看:
Cache-Control 里的 s-maxage、max-age 是否允许中间层长期保存;Age 是否明显大于你预期的刷新周期;ETag 是否在源站已变化时仍保持不变;Vary 是否遗漏了实际影响正文的请求头,例如 UA 或语言。一个常见情形是:源站已经更新,但边缘节点仍返回旧 ETag,因为回源校验被跳过。此时你在百度收录情况查询里看到的快照或摘要偏向旧版本,并不能直接推出百度“抓错了”,它只是拿到了当时那一层返回的内容。反过来,如果 ETag 已变化而正文摘要没变,差异可能只是头部或空白字符,对收录判断影响很小。
没有源站日志、没有 CDN 后台权限时,仍然可以做三件事,并按结果决定下一步。
?probe=时间戳,观察是否绕过缓存并返回与默认请求不同的正文。若绕过缓存后版本变化,说明默认请求命中了旧缓存;若不变,说明差异不在这一层。curl -I 或等价方式分别记录各层响应头,重点比对 Age 与 ETag。这一步的动作结果是:你能把“版本不同”缩小到某一层或某一分支,而不是继续在搜索引擎侧猜测。这些动作能帮你定位一致性问题的范围,但不能证明百度已经收录了哪个版本,也不能证明抓取频率或索引状态因此改变。请求量、抓取量或某次查询结果归零,同样不能单独证明处理正确,它还可能来自查询方式变化、抽样差异或服务端临时波动。
当你确认差异来自某一层缓存,下一步不是立刻要求刷新,而是先确认刷新动作会影响哪些 URL 和哪些参数组合。假设缓存键包含查询串,那么只刷新不带参数的 URL 可能仍留下带参数版本的旧内容;假设 Vary 配置遗漏了 UA,那么刷新后不同设备仍可能拿到不同版本。此时应记录刷新前后的 ETag、正文哈希和 Age,用同一组请求复测,确认各层是否收敛到同一版本。
如果复测后各层版本一致,再回到百度收录情况查询观察摘要与快照是否随之变化;若仍不一致,问题可能已不在缓存层,而在于页面本身存在多套可访问路径、参数化重复内容或服务端渲染与客户端渲染输出不同。此时应优先收敛 URL 与内容输出,而不是继续增加缓存刷新次数。robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录,这些手段都不能替代对版本一致性的修复。只有把差异层、复现条件和修复后的复测结果记录清楚,才能判断下一步是继续查缓存、查应用分流,还是转向页面结构本身。