当同一路径在不同网络位置返回不同版本时,先不要继续加缓存规则,而要先确认差异是否由主域名选择造成:如果站点同时存在带 www 与不带 www、或 http 与 https 的多个可访问主机名,各层缓存很可能分别缓存了不同主机名下的响应。此时把其中一个主机名定为规范主域名,并让其余主机名在源站层就跳转到它,通常比逐层清缓存更能收敛问题;但如果业务必须保留多个主机名对外服务,则应改为在每层缓存中显式隔离主机名,而不是强行统一。
多层缓存返回不同版本,常见原因并不一定是缓存没刷新,而是请求在不同环节被改写到了不同主机名。可以做一个最小对照:对同一个资源路径,分别请求带 www 与不带 www 的地址,记录响应头中的 Content-Location、Vary、缓存状态字段以及正文里的绝对链接。若两个地址返回的正文主体不同,而同一地址重复请求结果稳定,那么问题更可能出在主域名未统一,而不是某一层缓存失效。
这一步的实际动作是固定请求集合:选定 2 到 3 个代表路径,分别从直连源站、绕过 CDN、经过完整链路三种位置请求,并保留响应头。结果会直接决定下一步方向:如果只有完整链路出现差异,问题在中间层;如果直连源站也出现差异,说明源站按主机名返回了不同内容,需要先处理主域名选择,而不是继续调缓存策略。
如果所有入口都可以收敛,优先把选定的主域名设为唯一对外主机名。实施动作包括:在源站把其余主机名做永久跳转,跳转目标使用主域名;检查页面内绝对链接、站点地图、规范链接是否都指向主域名;再逐层清理旧主机名下的缓存条目。这样做的结果是后续请求不再以多个主机名进入缓存,各层看到的键趋于一致,差异会随旧条目过期而减少。
需要注意例外:跳转本身也会被缓存,如果跳转响应被长期缓存,后续即使修改规则也可能继续返回旧跳转。因此跳转上线后要验证跳转响应的缓存行为,而不是只验证跳转目标是否正确。
如果因为历史分发、多区域或多品牌原因不能收敛,那么主域名选择的作用变成“声明规范”,而不是“物理唯一”。此时应在每层缓存中把主机名纳入缓存键,确保带 www 与不带 www 的响应不会互相覆盖;同时让页面内的规范链接统一指向选定主域名。实施后,各层仍可能返回不同主机名,但同一主机名下的版本应当稳定,差异范围被限制在可解释的主机名维度内。
这种选择的代价是缓存命中率下降、存储占用上升,并且规范信号与实际上线主机名不完全一致。若不能接受这个代价,就应回到条件一。
仅凭页面内容不同无法区分原因。可比较三类证据:第一,响应头中的缓存命中标识与年龄字段,若同一主机名在不同层命中状态不同,说明是缓存副本差异;第二,正文中的绝对链接主机名,若随请求主机名变化,说明源站按主机名生成内容;第三,规范链接指向,若各主机名都指向同一目标,说明规范意图已统一,但缓存键未统一。
把这些证据按“主机名—缓存层—响应版本”整理成一行一条的记录,再决定动作。若证据显示源站按主机名返回不同正文,先做主域名收敛或缓存键隔离;若证据显示源站一致而仅中间层不同,则针对该层清理或调整键规则。这个顺序能避免在源站未统一时反复清缓存。
改动上线后,用同一组代表路径重复之前的三种位置请求,比较响应头与正文是否按预期一致。验证时要区分两种结果:同一主机名在所有层返回一致,说明缓存键或源站已收敛;不同主机名仍返回不同版本但各自稳定,说明属于条件二下的预期状态,需要确认规范链接与跳转逻辑是否符合选择。
如果验证后差异依旧,检查是否遗漏了旧主机名的跳转缓存、页面内绝对链接或站点地图中的旧地址。这些残留会让部分请求继续进入旧主机名路径,使多层缓存再次出现分叉。此时的处理顺序仍是先确认主域名选择是否被执行到位,再处理缓存层。
不同搜索引擎对主机名与规范信号的支持情况须分别核查,不能假设一处配置在所有入口都产生相同效果。定位一致性问题时,先把主域名选择落到唯一入口或明确隔离,再验证各层响应,通常比继续叠加缓存规则更有效。