问题出现得很突然,日志倒是留得挺全。首页响应里带了 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 默认策略迟早会出事。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189