问题出现得很突然,日志倒是留得挺全。首页响应里带了 Set-Cookie,CDN 仍按 HTML 缓存了 30 分钟,蜘蛛拿到的版本里混着上一个访客的会话标识,页面正文出现会员昵称。
刚开始盯着「缓存键只用了 URL,没有区分登录状态」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。源站没有对带 Set-Cookie 的响应声明不可缓存。还有一种是CDN 默认不按 Set-Cookie 跳过缓存。
还有一种情况,边缘缓存了整段 HTML,包含个性化区块。
上来先看首页响应头是否带 Set-Cookie
curl -sI https://www.example.com/ | findstr /i "set-cookie cache-control"
再往下确认边缘缓存命中情况
curl -sI https://www.example.com/ | findstr /i "x-cache age"
给带会话的响应加 private
add_header Cache-Control "private, no-store";
等前面都确认过,再清掉首页缓存并复验
curl -X PURGE https://www.example.com/
怎么算真的好了,看的是同一批现象。加 private 后首页不再被边缘缓存,蜘蛛拿到的 HTML 里没有会话信息,个性化区块也不再串号。
容易忽略的是,只要响应里可能出现 Set-Cookie,就必须显式声明 private,靠 CDN 默认策略迟早会出事。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
