Z-Blog 与 Nginx 缓存冲突:为什么登录后还看到旧页面
摘要
先说结论:登录后仍看到旧的未登录页面,本质是整页缓存把「未登录状态」缓存下来并返回给了登录用户。解决方向只有两个:让带 Cookie 的请求绕过缓存,或干脆不对动态页做整页缓存。 一、先确认是「真缓存」还是「假缓存」 无痕窗口与登录窗口分别
先说结论:登录后仍看到旧的未登录页面,本质是整页缓存把「未登录状态」缓存下来并返回给了登录用户。解决方向只有两个:让带 Cookie 的请求绕过缓存,或干脆不对动态页做整页缓存。
一、先确认是「真缓存」还是「假缓存」
- 无痕窗口与登录窗口分别访问同一页面,内容不同 → 大概率是缓存或 CDN。
- 用
curl -I看响应头有没有X-Cache: HIT、Age、cf-cache-status等标记。 - 清掉浏览器缓存再试,排除本地缓存干扰。
二、问题出在哪一层
- Nginx fastcgi_cache(服务器层):最常见元凶。配置里没按 Cookie 区分缓存。
- CDN 全站缓存:把 HTML 也缓存了,登录态cookie 形同虚设。
- 主题或插件的页面缓存:部分优化插件会生成静态 HTML。
- 浏览器本地缓存:HTML 被设置了较长 max-age。
三、Nginx 侧的正确做法
- 在缓存规则里加判断:请求带登录相关 Cookie 时
fastcgi_cache_bypass并fastcgi_no_cache,直接回源。 - 只缓存 GET,不缓存 POST 与后台路径。
- 对后台目录、登录态页面直接
fastcgi_cache off。 - 修改后
nginx -t再 reload,并清理已存在的缓存目录。
四、CDN 侧的正确做法
- HTML 设置「遵循源站」或不缓存;静态资源才做长缓存。
- 开启「忽略 Cookie 缓存的规则」要格外小心,一旦对 HTML 生效就会串号。
- 改完务必刷新 CDN 缓存,否则旧内容会继续存在。
五、验证方法
用一个已登录会话访问,看响应头是否还带缓存命中标记;再退出登录访问一次,两边的 HTML 应该不同。若相同,说明仍有环节在缓存登录态,继续往下查。
记住原则:能缓存的只有静态资源与匿名页面,绝不能缓存带身份的内容。
2026年10月22日 10:39
前后30天 · 点日期看归档
9月22日
9月23日
9月24日
9月25日
9月26日
9月27日
9月28日
9月29日
9月30日
10月1日
10月2日
10月3日
10月4日
10月5日
10月6日
10月7日
10月8日
10月9日
10月10日
10月11日
10月12日
10月13日
10月14日
10月15日
10月16日
10月17日
10月18日
10月19日
10月20日
10月21日
10月22日
10月23日
10月24日
10月25日
10月26日
10月27日
10月28日
10月29日
10月30日
10月31日
11月1日
11月2日
11月3日
11月4日
11月5日
11月6日
11月7日
11月8日
11月9日
11月10日
11月11日
11月12日
11月13日
11月14日
11月15日
11月16日
11月17日
11月18日
11月19日
11月20日
11月21日