事情本身不复杂,线索都在日志里。为了让移动和桌面拿到不同缓存,在响应头里加了 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 做分桶只会让缓存和蜘蛛一起犯迷糊。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189