结论先行:当同一URL在多层缓存中返回不同版本时,先判断差异是否影响百度蜘蛛可见的最终HTML,而不是急着清缓存。若差异只出现在已登录、带Cookie或特定边缘节点的响应中,通常不影响收录;若蜘蛛拿到的版本与回源版本在标题、正文、canonical或robots meta上不同,则一致性问题成立,需要继续定位是哪一层改写了响应。
多层缓存常见的链路是:浏览器缓存、CDN边缘节点、反向代理缓存、应用层缓存、数据库缓存。不同层可能因为TTL不同、缓存键设计不同、变体规则不同而返回不同版本。定位的第一步不是比较所有层,而是比较“百度蜘蛛会拿到什么”。
在没有完整日志权限时,可以执行的最小动作是:用同一URL、同一User-Agent(模拟百度蜘蛛)、不带Cookie、不带登录态,从多个网络出口请求两次,间隔大于最短TTL,保存完整响应头与响应体。重点看Age、X-Cache、Cache-Control、Vary、ETag以及响应体中的<title>、<link rel="canonical">、<meta name="robots">。如果这些字段在不同请求间一致,即使其他层有差异,也大概率不是收录层面的问题。
这个动作的结果会直接影响下一步:若蜘蛛可见版本一致,问题应转向抓取频次或索引策略;若不一致,才进入缓存层归因。
不同版本往往不是随机出现,而是由缓存键和变体规则触发。常见的区分依据有三组:
?from=、?utm=的请求是否命中不同缓存对象。若只有带参数版本不同,问题在缓存键是否过度包含查询串。Vary是否包含User-Agent、Accept-Encoding、Cookie。若Vary设置过宽,同一URL会被拆成多个版本。假设一个场景:某页面在A节点返回新版标题,在B节点返回旧版标题,回源直接请求返回新版。此时可以推断B节点持有旧副本,但不能仅凭这一点断定百度蜘蛛一定抓到了B节点。还需要确认蜘蛛出口IP段与节点映射关系,否则“节点差异”只是相关性,不是因果。
如果差异只出现在带登录态或内部调试头的响应中,而匿名蜘蛛请求始终一致,那么前面关于“一致性问题成立”的判断就不成立。这种情况常见于应用层根据Cookie或内部头输出不同模板,但CDN和反向代理对匿名请求缓存的是同一版本。此时清缓存、改TTL都不会影响收录,真正需要检查的是是否有缓存规则把登录态响应写入了公共缓存。
另一个反例是:回源本身就不稳定,两次直接回源返回不同版本。这时问题不在缓存层,而在应用层或数据层,缓存只是放大了差异。区分方法是绕过所有缓存直接请求源站,连续多次比较响应体。若源站就不一致,先修源站,再谈缓存。
没有CDN后台、没有源站日志、没有百度抓取日志时,仍可做三件事:
Cache-Control中的s-maxage、max-age与stale-while-revalidate。若旧版本在过期后仍被返回,可能是回源失败后使用了过期副本。这些动作能给出方向,但不能推出“百度一定收录了哪个版本”。抓取量或某节点命中量归零,也不能单独证明缓存已修复,还可能是采样时间、节点调度或请求头变化导致的。下一步应把匿名采样结果与源站直接响应做对照:若两者一致,问题收窄到边缘节点;若两者不一致,问题在源站或应用层。确定层级后,再决定是调整缓存键、缩短TTL,还是修源站输出。