这个坑值得记一笔。站点接入 CDN 后开了全站缓存,缓存键里没带 cookie,早上有运营登录后台,之后两小时匿名访客打开首页看到的是后台工具条和用户名。
把日志和配置对完,能解释这个现象的基本就这几处。缓存键只按 URL 计算,Set-Cookie 响应也被一起缓存;源站没有输出 Cache-Control: private,CDN 默认按可缓存处理;WordPress 的登录态靠 cookie 判断,页面 HTML 本身就带用户信息。
先验证响应里是否带 Set-Cookie 且被缓存
curl -sI https://www.example.com/ | grep -Ei "set-cookie|x-cache"
然后对登录态强制不缓存
add_action('send_headers', function(){ if (is_user_logged_in()) { header('Cache-Control: private, no-store'); } });
剩下的就是在 CDN 侧把 cookie 加入缓存键
curl -X PURGE https://www.example.com/ && curl -sI https://www.example.com/ | grep -i x-cache
当时还开着另一个排查窗口,两边日志对照着看才定位到。
同一份数据我导出了两份,一份留底,一份拿来试。
怎么算真的好了,看的是同一批现象。带登录 cookie 的请求命中显示 BYPASS,匿名请求仍为 HIT,响应头不再出现 Set-Cookie,页面里查不到用户名。
全站缓存最容易踩的就是登录态和购物车,宁可让这两类请求全部回源,也别图那点命中率。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
