先给结论:不要试图用“清缓存再刷新”把两边刷成一样,而应把设备差异、登录状态差异拆成独立变量,分别固定后对照。具体做法是:先用匿名窗口和已登录窗口各取一份原始响应,再换设备重复一次,最后只比较同一变量下的差异。若差异只出现在登录态,问题通常出在会话、Cookie 或服务端按身份分流;若匿名态也随设备变化,则更可能是缓存、CDN 节点或 UA 分流。这个判断直接决定下一步是查应用层还是查接入层。
假设同一个重庆虚拟主机上的页面地址,在办公电脑上匿名访问显示 A 内容,登录后显示 B 内容;换手机流量访问,匿名态又显示 C 内容。此时三种结果并存,不能直接判定“主机返回不稳定”。需要先明确:这是同一台主机、同一域名、同一路径,差别只在设备和登录状态。把这三个结果分别记录,才能进入对照。
对照的前提是每次只变一个条件。建议按下面顺序取样,每一步都保留可复查的原始记录:
如果第 1 步和第 3 步结果不同,说明差异与登录状态无关,优先怀疑接入层;如果第 1 步和第 2 步不同、第 3 步和第 4 步也不同,但匿名态跨设备一致,则优先怀疑应用层按身份分流。这个区分是后续动作的依据。
不要只看正文。响应头中的缓存状态、内容协商和会话标识往往比正文更能说明问题。可重点对照:
Cache-Control 与 Age:若匿名态出现不同 Age,说明中间缓存可能返回了不同副本。Vary:若声明按 User-Agent 或 Cookie 变化,则不同设备或登录态返回不同内容是预期行为。Set-Cookie:登录态是否下发了新的会话标识,匿名态是否复用了旧标识。Content-Length 或正文长度:长度差异可作为快速区分两个版本的信号,但不能单独证明原因。这些字段只能提示方向,不能直接下结论。例如 Age 不同,也可能是不同节点回源时间不同,不一定是缓存配置错误。
假设匿名态跨设备内容不同,下一步动作是:在请求地址后附加一个不会命中缓存的查询参数,例如 ?check=1,再分别从两台设备匿名请求。若附加参数后两边内容一致,说明差异来自缓存键或缓存副本;若仍不一致,说明差异不在缓存层,应转向检查源站是否按 IP、UA 或地域做了内容分流。
这个动作的结果会直接改变下一步:命中缓存问题时,应检查缓存键是否包含设备相关字段;不命中缓存问题时,应检查应用配置中是否存在按请求来源分流的规则。不要跳过这一步直接清空全部缓存,否则会丢失可对照的原始状态。
如果差异只在登录后出现,先确认会话是否真正落在同一台主机上。重庆虚拟主机若处于多节点或负载均衡环境,会话未共享时,不同设备可能命中不同后端,返回不同内容。此时可对照登录后的会话标识是否在多次请求中保持一致。若标识变化,优先检查会话存储是否集中;若标识一致但内容不同,则检查应用是否按用户角色或登录来源返回不同版本。这里要区分“同一账号”和“同一会话”,两者不是一回事。
若响应头明确声明按 User-Agent 或 Cookie 变化,且匿名态与登录态的内容差异符合业务设计,那么同一地址返回不同内容是预期行为,不需要修复。此时应做的是把这种差异写进交付说明,而不是强行统一。反之,若没有任何声明却出现差异,才需要继续排查。判断依据是响应头的声明与实际行为是否一致,不是内容看起来是否“奇怪”。