先看差异是否随请求身份变化:同一 URL 在登录态与匿名态、带与不带查询参数、不同地区出口下返回不同内容,通常说明某一层缓存按错误的键做了区分或未区分。定位时不要先清空所有缓存,而应逐层固定输入、记录响应头与正文哈希,确认差异首次出现在哪一层。
如果匿名请求与登录请求拿到不同版本,先检查页面缓存是否把登录 Cookie 纳入了缓存键。若未纳入,登录用户可能看到匿名缓存副本;若纳入过度,同一篇文章会为每个会话生成独立副本,命中率骤降但一致性反而正常。两种情况的证据不同:前者表现为登录态内容被匿名版本覆盖,后者表现为缓存条目数量异常膨胀。
判断依据是响应头中的缓存命中标识与 Age 值。若同一 URL 在两次匿名请求中 Age 持续增长而正文哈希不变,说明边缘层在正常复用;若 Age 归零且正文哈希变化,需继续向上游查找。此时不要仅凭抓取量或请求量下降判断问题已解决,那可能只是缓存全部未命中导致的假象。
选择取决于站点是否依赖按用户或按地区变化的动态内容。
若两种做法都看似合理,优先选统一缓存键,除非个性化内容涉及价格、权限或合规信息。涉及这些内容时,错误复用版本的代价高于回源成本。
准备一组固定请求:同一 URL、同一 User-Agent、同一 Cookie 状态,分别直连源站、绕过边缘层、经过完整链路。对每次响应记录状态码、关键响应头与正文哈希。假设某篇文章在直连源站时哈希为 A,经过边缘层后匿名请求哈希变为 B,而登录请求仍为 A,则差异最可能出在边缘层的缓存键或页面缓存规则,而非数据库或主题渲染。
这一步的实际动作是先固定一组请求并记录基线,再逐层启用缓存。结果会直接决定下一步:若差异只在启用某一层后出现,就集中检查该层的键规则;若所有层都返回同一哈希,则问题可能来自客户端或 CDN 之外的中间代理。
例外情况包括:站点使用 ESI 或边缘包含拼装页面,此时整页哈希本就不应一致,应改为比对各片段;以及源站开启了按地理位置的跳转,此时不同出口 IP 返回不同重定向属于预期行为。遇到这些例外,先确认架构设计,再判断是否为故障。
当各层返回同一版本后,还需验证缓存清除是否覆盖全部变体。动作是发布一次测试更新,分别以匿名、登录和带参数请求检查旧版本是否仍可访问。若旧版本仍存在,说明清除规则未覆盖该变体,需要补充清除条件而非扩大清除范围。清除范围过大虽能暂时消除差异,但会持续拉高回源,掩盖真正的键设计问题。
另外,robots.txt 的抓取限制不等于索引移除,缓存层返回一致也不代表搜索引擎看到的就是同一版本,二者需要分别核查。只有在确认各层键规则、清除规则和变体边界都符合预期后,才能把该问题视为已定位。