Z-Blog 与 Nginx 缓存冲突:为什么登录后还看到旧页面

· zblog · 阅读 10
摘要

先说结论:登录后仍看到旧的未登录页面,本质是整页缓存把「未登录状态」缓存下来并返回给了登录用户。解决方向只有两个:让带 Cookie 的请求绕过缓存,或干脆不对动态页做整页缓存。 一、先确认是「真缓存」还是「假缓存」 无痕窗口与登录窗口分别

先说结论:登录后仍看到旧的未登录页面,本质是整页缓存把「未登录状态」缓存下来并返回给了登录用户。解决方向只有两个:让带 Cookie 的请求绕过缓存,或干脆不对动态页做整页缓存。

一、先确认是「真缓存」还是「假缓存」

  • 无痕窗口与登录窗口分别访问同一页面,内容不同 → 大概率是缓存或 CDN。
  • 用 curl -I 看响应头有没有 X-Cache: HIT、Age、cf-cache-status 等标记。
  • 清掉浏览器缓存再试,排除本地缓存干扰。

二、问题出在哪一层

  1. Nginx fastcgi_cache(服务器层):最常见元凶。配置里没按 Cookie 区分缓存。
  2. CDN 全站缓存:把 HTML 也缓存了,登录态cookie 形同虚设。
  3. 主题或插件的页面缓存:部分优化插件会生成静态 HTML。
  4. 浏览器本地缓存: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 应该不同。若相同,说明仍有环节在缓存登录态,继续往下查。

记住原则:能缓存的只有静态资源与匿名页面,绝不能缓存带身份的内容。