先做一个判断:如果同一资源在浏览器、CDN 和源站返回的协议或内容版本不一致,问题通常不在“HTTP 还是 HTTPS 更好”,而在某一层缓存把另一层的响应留了下来。定位顺序应从离用户最近的一层向源站反向核对,而不是先改配置。只有当你能用带缓存标识的响应证明差异出现在哪一层,才值得决定是保留该层缓存、改写缓存键,还是让它退出这条链路。
多层缓存不一致最常见的表现是:刷新页面后协议变了、跳转链变长、或同一 URL 返回了不同正文。要区分这些情况,需要每层都能给出可核对的证据。建议对同一个 URL 连续发起请求,并记录以下字段:
Age:该响应在缓存中已存在多久。数值持续偏大,说明命中的是缓存而非源站。Cache-Control、Expires:决定这层缓存是否被允许保留旧版本。Vary:决定缓存键是否随请求头变化。若 Vary 缺失而内容又依赖请求头,就容易串版本。Via、X-Cache 一类代理标识:用于判断响应经过了几层。动作上,先只在一个固定网络出口测试,避免把本地代理、运营商缓存和设备缓存混在一起。若同一出口下多次请求结果稳定,但换出口后结果改变,差异更可能来自中间层而非源站。这个结论会直接决定下一步:继续查中间层配置,还是回到源站排查生成逻辑。
确认差异层之后,处理方式不是唯一的。是否保留该层缓存,取决于该层是否真的在承担流量压力,以及它能否正确区分版本。
保留的前提:该层缓存能正确使用缓存键,且 Vary 覆盖了真正影响响应的请求头。此时要做的是修正缓存键或补齐 Vary,而不是关掉缓存。保留的收益是回源压力下降;风险是配置错误会继续放大不一致。
改写的前提:差异只出现在协议或跳转链上,正文本身一致。例如源站已统一输出 HTTPS 链接,但中间层仍缓存了旧的 HTTP 跳转。此时应改写该层的缓存规则或缩短其 TTL,让新响应尽快覆盖旧副本。改写适用于“内容对、外壳旧”的情况;若正文本身不同,改写缓存键通常无效。
退出的前提:该层无法提供足够的调试信息,或它的缓存行为不受你控制,且不一致已经影响到关键页面。让该层退出这条链路是止损手段,代价是回源量上升。退出前应确认源站能承受这份压力,否则只是把问题从缓存层转移到源站。
假设某页面源站固定返回 HTTPS,但用户在部分网络下看到 HTTP 版本,且正文完全相同。此时有两种合理解释:一是中间缓存保留了旧的 301 跳转;二是请求在到达源站前就被某层以 HTTP 直接返回,源站根本没参与。区分方法是对比同一 URL 在不同出口下的 Age 和重定向状态码:若旧版本带有较大的 Age 且状态码是 301,更支持“缓存保留旧跳转”;若响应没有缓存标识、状态码直接是 200 且协议为 HTTP,则更支持“请求未到源站”。
这个对比的意义在于:前者只需推动该层刷新或缩短 TTL,后者则要检查链路中是否存在未受控的代理。两种解释对应完全不同的动作,所以不能只凭“看到 HTTP”就下结论。
抓取量或请求量下降、某个日志字段归零,都不能单独证明缓存处理正确。它们还可能来自抓取节奏变化、测试出口切换、日志采样或统计口径调整。同理,robots.txt 中的抓取限制不等于可靠的索引移除,站点地图也不保证收录;HTTPS 本身不保证安全无漏洞或排名。这些事实提醒我们:一致性问题的结论应建立在多层响应证据的相互印证上,而不是单一指标的变化。
当多层证据指向同一层时,再决定保留、改写还是退出;若证据互相矛盾,优先补充观测点,而不是先改配置。这样每一步动作的结果都能反过来验证或推翻上一步的判断。