先给结论:不要在“收录不好”这个层面找原因,而要把同一条 URL 在每一层缓存里的响应逐层取出来对比。多层缓存返回不同版本,通常意味着某一层命中了旧副本、某一层跳过缓存回源、或者各层对 Vary、Cookie、查询串的处理不一致。定位顺序应当是:先确认回源内容唯一,再确认各层缓存键一致,最后才判断百度拿到的是哪一层。顺序颠倒,改动会互相掩盖。
这两种情况的处理方向完全不同,选错会白改一轮。
第一种条件:回源本身就不唯一。源站对同一路径按 User-Agent、Cookie、地区或登录态返回不同 HTML,缓存只是把这种差异放大。判断依据是绕过所有缓存直接请求源站,多次请求同一 URL,如果正文、canonical、结构化数据仍不一致,问题在源站,不在缓存。
第二种条件:回源唯一,但各层缓存键不同。典型表现是 CDN 按完整查询串缓存,反向代理按路径缓存,应用层又按会话缓存。此时直接回源结果稳定,经过缓存后开始分叉。判断依据是分别请求“带缓存”和“绕过缓存”两条路径,比较响应头和正文摘要。
可区分的证据很简单:如果差异只出现在带 Cookie 或带特定查询串的请求上,且去掉这些因素后一致,就偏向缓存键问题;如果去掉所有变量后仍不一致,就偏向回源问题。一个假设例子:某列表页在 CDN 上返回 A 版本,在反向代理上返回 B 版本,直接回源返回 A。此时不能断定 CDN 错,因为反向代理可能命中了更早的 B,需要看两层各自的缓存时间和键规则,而不是只看哪一层“看起来更新”。
不要靠肉眼翻页面。给每层加一个可核对的标记,是成本最低、结论最硬的动作。
<meta name="content-rev" content="...">,或放入响应头。标识只反映内容版本,不承担 SEO 作用。这个动作的结果直接决定下一步:版本标识不一致,就不要先动 robots 或站点地图,因为那些不会改变缓存副本;版本标识一致而正文不同,就不要先清缓存,因为清了还会被同一规则重新改写。
请求量、抓取量或某个统计突然下降,不能单独证明缓存处理正确。它还可能来自抓取配额调整、站点结构变化、外部链接波动,或统计口径本身改变。把这些现象当作唯一证据,容易把无关改动当成有效改动。
另外要区分抓取限制与索引结果:robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。缓存一致性问题解决后,收录是否变化仍受其他因素影响,不能承诺固定见效时间。
还要注意 HTTPS 不保证安全无漏洞或排名,它和缓存版本问题没有直接因果关系,不要把它当成本题的排查项。
上述逐层比对适用于你能控制源站和至少一层缓存的场景。如果只有 CDN 控制权、拿不到源站版本标识,就只能退而求其次:固定请求头,多次请求同一 URL,观察返回是否稳定,并记录变化的时间点,用时间相关性缩小范围,但仍不能直接断定是哪一层造成。
如果站点对登录用户和未登录用户返回不同内容,先明确百度抓取对应的是哪一类,再决定是否让缓存按该类别统一返回。多语言或多地区站点同理,需要先确认目标版本,再谈缓存键是否一致。
最后,各搜索引擎对缓存、抓取和索引的处理并不相同,涉及百度时应以百度实际返回的结果为准,不要用其他引擎的表现直接推断。定位顺序始终是:回源唯一性 → 缓存键一致性 → 各层变换规则,按这个顺序走,才能把“不同版本”落到具体那一层。