先别急着清缓存或改代码。拿一个具体页面,用固定URL和固定请求头,分别记录CDN边缘、反向代理和源站返回的响应头与正文指纹;如果三处指纹不一致,问题通常出在缓存键或缓存层级,而不是百度收录更新本身。下一步是判断哪一层在“回源”和“命中”之间切换,再决定是统一缓存键还是调整刷新策略。
多层缓存的不一致,最常见的表现是同一URL在短时间内返回不同正文,而百度蜘蛛恰好抓到旧版本,于是收录更新看起来“反复”。要定位,先选一个可公开访问、内容稳定的页面作为样本,不要用首页或带个性化参数的页面。
用命令行记录三次请求:第一次强制回源,第二次命中边缘缓存,第三次带一个随机查询参数绕过缓存。每次保存完整响应头和正文的哈希值,例如用 curl -sI 看头,用 curl -s | sha256sum 看正文。假设三次哈希分别记为A、B、C,如果A和C相同而B不同,说明边缘缓存里存的是旧版本;如果A和B相同而C不同,说明源站本身在按参数分流。
这个动作的结果决定下一步方向:若差异只出现在带参数的请求上,优先检查缓存键是否包含了不该包含的查询参数;若差异出现在无参数请求上,优先检查源站发布流程和代理层缓存过期时间。
缓存键决定了“什么算同一个资源”。当CDN或反向代理把 ?v=1 和 ?v=2 当成两个对象时,旧参数对应的缓存不会自动失效,百度抓到的可能仍是旧正文。反过来,如果缓存键忽略了查询参数,而源站又依赖参数返回不同内容,就会把A页面的正文缓存到B页面的URL上。
判断方法:对同一路径分别请求带参数和不带参数的版本,比较 Age、X-Cache、ETag 和 Last-Modified。如果带参数版本的 Age 很小甚至没有,说明它没走共享缓存;如果两个版本 ETag 相同但正文不同,说明缓存键或源站响应头配置存在矛盾。
只有确认差异来自缓存键之后,统一缓存键才有意义;否则改缓存键只会把问题推到另一层。这一步的产出应该是一张表:请求条件、命中层级、响应头特征、正文哈希,四列足够。
假设你更新了页面正文,但百度收录更新仍显示旧摘要。此时不要直接提交刷新,先做一次受控发布:改一个可见但低风险的文本,例如页脚日期,然后按顺序请求源站、代理、CDN边缘。
Host 头,确认源站已经是新版本。Age 是否归零、ETag 是否变化。如果源站已新、代理已新、边缘仍旧,那么问题集中在边缘缓存的刷新或过期策略;如果源站仍旧,则与百度收录更新无关,应先修发布流程。这个顺序能避免把源站问题误判为搜索引擎问题。
需要说明的是,刷新缓存后百度蜘蛛不一定立刻重抓,抓取量或某个样本的返回变化不能单独证明缓存已正确修复,还可能受抓取配额、页面重要性、请求时段影响。因此验证应以你自己的三层请求结果为准,而不是以收录状态为准。
个别样本成立、规模化后出现例外,通常是因为样本页恰好命中了同一种缓存路径。要扩大验证,按以下维度分组抽取,而不是随机抽:
Cache-Control 为 no-store、private、max-age 的页面分别检查。如果例外集中在带参数或带个性化头的分组,说明共享缓存本就不该缓存这些响应,问题应转为“为什么百度抓到了不该缓存的版本”,而不是继续统一缓存键。若例外集中在最近发布的分组,则优先检查发布时是否只刷新了源站、没有触发代理和边缘的失效。
这里有一个常见误区:用 robots.txt 限制抓取某条路径,并不等于把已收录的旧版本移除;站点地图也不保证新版本被及时收录。两者都不能替代缓存一致性修复。HTTPS 同样不保证缓存层不会返回旧正文,它只解决传输加密,不解决版本同步。
完成上述分层后,你手里应该有一组可复查证据:固定URL、固定请求头、三层响应头、正文哈希、发布时间。接下来按证据选择动作,而不是同时改多个配置。
如果证据指向缓存键:只调整缓存键规则,让同一内容对应同一键,并观察下一次发布时三层是否同步变化。如果证据指向边缘刷新:只调整刷新触发条件,例如发布后主动失效对应路径,而不是全站刷新。如果证据指向源站发布:先修发布流程,缓存层不动。
每次只改一个变量,改完后重复同一组请求,比较哈希是否收敛。若收敛,再把样本扩大到同组页面;若不收敛,说明还有一层未纳入观察,例如代理链中的第二级缓存或对象存储的元数据缓存。定位一致性问题的关键不是猜哪层坏了,而是让每一层都留下可比较的响应证据,再据此决定下一步只动哪一层。