先看一个前提:域名投资价值相关的页面通常不是单一缓存层。CDN边缘节点、反向代理、应用层对象缓存、浏览器缓存各存一份,版本不一致时,先确认差异出现在哪一层,再决定是清缓存还是改源站。判断依据不是“哪层看起来旧”,而是同一请求在绕过不同层后返回的内容是否收敛。假设站点用CDN加速一个域名详情页,同一URL在A地返回旧价、B地返回新价,这就是典型的多层版本分叉,不是单纯的缓存过期。
定位一致性问题的第一步不是清缓存,而是固定一个可复现的请求条件:相同URL、相同查询参数、相同请求头(尤其是Accept-Encoding和Cookie)、相同出口IP或至少相同地区。条件不固定时,你看到的“不同版本”可能只是压缩格式、语言协商或登录态差异,与缓存层无关。
固定条件后,用逐层剥离的方式观察返回头。重点看Age、Cache-Control、ETag、Vary、X-Cache这类字段,它们能说明响应来自哪一层、是否命中、按什么维度区分版本。剥离顺序建议从最外层往内:先直连源站,再绕过CDN回源,最后经完整链路。每绕一层记录一次响应体摘要和关键头,直到找到版本开始分叉的那一层。
这里有一个容易踩的坑:请求量或抓取量归零不能单独证明处理正确。如果某个地区流量本来就少,缓存被清后自然没有新请求,这不等于版本已经一致。合理解释还包括探测点太少、DNS尚未收敛、探测工具本身命中了本地缓存。要证明一致,需要在多个出口重复同一请求并比较响应体,而不是看请求计数。
发现分叉后,常见的两种做法是“先刷所有缓存层”和“先改源站再让缓存自然过期”。两者都成立,但成立条件不同。
区分这两类的证据很直接:直连源站、用相同条件多次请求,如果源站自身就返回多个版本,问题在源站;如果源站稳定返回同一版本,问题在缓存层。这个判断决定了下一步动作的方向,方向错了,后续所有操作都是白费。
假设一个域名列表页根据请求来源地区显示不同货币的挂牌价,源站逻辑按IP段判断地区,但CDN缓存键只包含URL,不包含地区。结果A地区用户先请求,缓存了A地区版本,B地区用户随后拿到A地区版本。此时直连源站,用A、B两个出口请求,源站会分别返回对应货币;经CDN请求,两个出口都返回同一版本。
这个证据指向缓存键设计问题,不是缓存过期问题。动作应该是让缓存键包含地区维度,或者在响应头里用Vary声明地区协商,而不是反复刷缓存。刷缓存只能短暂掩盖,下一个用户请求又会写回错误版本。这个例子里,先改源站协商逻辑或缓存键,再让旧缓存过期,才是有序的修复路径。
存在几类例外,不能套用上面的顺序。第一,如果分叉只出现在某个ISP或某个边缘节点,且直连源站正常,优先怀疑该节点的缓存或回源链路,而不是全局源站逻辑。第二,如果响应头里Cache-Control是no-store或private,那么问题通常不在共享缓存层,而在浏览器或应用层会话。第三,如果站点同时有搜索引擎抓取、平台推荐和广告落地页,不同渠道可能请求带不同参数的URL,参数差异本身就会产生不同缓存对象,需要先统一参数策略再谈一致性。
收尾判断的标准是:在固定条件下,多个出口、多次请求返回的响应体摘要和关键头一致,且源站与缓存层的版本指向同一份内容。达到这个状态后,再移除临时探测规则,观察一段时间。如果此时仍有零星不一致,记录下具体出口和请求头,作为下一轮定位的输入,而不是重新从头刷缓存。