FastCGI 缓存未识别 Session 状态会导致会话越权,必须通过 Nginx 配置显式跳过登录态路径与敏感 Cookie 请求,并同步设置 fastcgi_cache_bypass 和 fastcgi_no_cache;禁用 POST 缓存,限制 cache_methods 为 GET/HEAD;配置 purge 接口实现手动清缓存。

FastCGI 缓存未识别 Session 状态,会导致已登录用户的私有页面(如后台、个人中心、订单页)被缓存并返回给其他访客,造成典型的会话越权——这不是缓存“失效”,而是缓存“错用”。核心问题在于:Nginx 缓存层在 PHP 执行前就做了响应决策,完全不感知 $_SESSION 或 Cookie 中的用户身份。必须让缓存逻辑主动识别并绕过敏感请求。
明确跳过登录态与管理路径
在站点 Nginx 配置的 location ~ \.php$ 块内,必须显式定义哪些请求**绝不缓存**。不能依赖 PHP 代码中的 session_start() 或 if($_SESSION) —— 那时早已过了缓存判断时机。
- 匹配常见后台入口:/wp-admin/、/wp-login.php、/admin/、/user/、/member/、/dashboard/
- 匹配关键 Cookie 标识:wordpress_logged_in、PHPSESSID、laravel_session、JSESSIONID 等
- 使用
set $skip_cache 0初始化,再用if多条件覆盖为 1
成对启用 bypass 与 no_cache 控制
fastcgi_cache_bypass 决定“是否查缓存”,fastcgi_no_cache 决定“是否存缓存”。二者必须同时设置,且变量值为 1 时才真正生效:
审查 Remix v2 代码中的 v1 形态 meta 导出(v2 中为破坏性变更),cookie 安全漏洞(httpOnly、secure、密钥轮换),认证门位于错误层级,以及其他
-
fastcgi_cache_bypass $skip_cache;→ 值为 1 时,跳过缓存查找,直接转发给 PHP -
fastcgi_no_cache $skip_cache;→ 值为 1 时,即使响应本可缓存,也禁止写入缓存文件 - 漏掉任一指令,都会导致越权风险:只设 bypass 但没禁存,仍可能把登录页缓存;只设 no_cache 但没 bypass,可能命中旧缓存返回错误内容
禁用非安全方法的缓存
POST 请求天然携带用户操作意图(如提交表单、修改资料),绝不可缓存:
- 在 fastcgi 缓存配置块中添加:
fastcgi_cache_methods GET HEAD; - 确保
fastcgi_cache_key不包含 $request_body(POST 数据无法参与 key 构建) - 避免使用
if ($request_method = POST) { ... }方式判断——Nginx 的 if 在 location 中有执行限制,优先用 cache_methods 更可靠
预留手动清缓存通道
上线后若发现某类页面被误缓存,需能快速清除,而非等 inactive 超时:
- 在 Nginx 主配置中启用
fastcgi_cache_purge模块(需 nginx-full 版本支持) - 配置一个内部 purge 接口,例如:
location ~ /purge(/.*) { allow 127.0.0.1; deny all; fastcgi_cache_purge PHPENV_CACHE "$scheme$request_method$host$1"; } - 触发清除:
curl -X PURGE "http://yoursite.com/purge/wp-admin/"










