事情本身不复杂,线索都在日志里。为了让移动和桌面拿到不同缓存,在响应头里加了 Vary: User-Agent。上线后桌面用户偶尔看到移动版样式,蜘蛛抓到的版本也忽好忽坏。
第一反应是「移动版和桌面版共用同一个地址,缺少 canonical 指向」,验证下来不成立。
这类报错背后常见的原因有几处,逐个排除就行。Vary 只是告诉缓存按 UA 分桶,粒度由 UA 字符串决定,组合几乎无穷。少数情况下是CDN 的缓存键没有跟着带上 UA,命中率下降但偶发串页。
少数情况下是UA 归一化没做,同一个机型的不同版本被当成不同桶。
第一件事是确认响应头里的 Vary 取值
curl -sI https://www.example.com/a/ | grep -i vary
然后对比桌面与移动 UA 拿到的 HTML 是否一致
curl -s -A 'Googlebot' https://www.example.com/a/ | md5sum
随后改用响应式布局去掉 UA 分流
add_filter('wp_is_mobile', '__return_false');
复查缓存命中的版本是否稳定
curl -sI https://www.example.com/a/ | grep -i 'x-cache\|age'
恢复的判定其实很直接。两种 UA 拿到的 HTML 哈希一致,响应头里的 Vary 不再包含 UA,串页现象消失。
响应式站点不需要按 UA 分缓存,真要分就分到不同地址上,靠 Vary 做分桶只会让缓存和蜘蛛一起犯迷糊。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
