这类问题我又碰上了一次。站点给所有响应都加了 Vary: Cookie,本意是区分登录态。CDN 按这个头把同一地址切成很多份缓存,蜘蛛抓到的版本里带着某个用户的购物车提示,页面上还出现了别人的昵称,站内重复内容报告也跟着上涨。
第一反应是「CDN 忽略 Vary 只按 URL 缓存 把登录态页面发给了所有人」,验证下来不成立。
原因不止一个,得分开看。Vary 头让缓存键包含 Cookie 值 每个访客都生成一份副本;个性化区块在服务端渲染 没有做缓存分片或客户端补全;缓存过期时间设得很长 错版本会在节点上停留很久。
先看响应里的 Vary 与缓存状态
curl -sI https://www.example.com/ | grep -iE 'vary|x-cache|age'
再往下把个性化内容改成客户端渲染
fetch('/api/cart').then(r => r.json()).then(renderCart);
只对匿名请求开启缓存
set $skip 0; if ($http_cookie ~* 'session') { set $skip 1; } proxy_cache_bypass $skip;
等前面都确认过,再清掉节点上的错误副本
curl -X PURGE -H 'Host: www.example.com' https://www.example.com/
怎么算真的好了,看的是同一批现象。去掉 Vary: Cookie 并把个性化区块改为前端渲染后,节点上同一地址只剩一份缓存,页面上不再出现他人信息,重复内容报告也回落。
提醒一点。Vary 头写错会把缓存命中率打到很低,个性化内容最好别放在服务端渲染的公共页面里。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
