fastcgi_no_cache 是告诉 nginx 该响应绝不可进入 fastcgi_cache 的指令,作用于缓存决策环节而非禁止磁盘写入;适用于含 set-cookie、用户标识 url、非 get/head 请求及含瞬态字段的页面;需结合请求方法、cookie/参数、响应头三类条件精准配置,并同步禁用 cache_bypass、校验 cache_key、拦截 public 缓存头,最后通过 x-cache-status 验证生效。

fastcgi_no_cache 不是“硬性限制写入磁盘”的开关,而是**告诉 Nginx:这个请求的响应绝对不能进 fastcgi_cache**——它作用于缓存决策环节,不阻止磁盘写入本身(比如临时缓冲文件仍可能产生),但能确保敏感内容不会被持久化为可复用的缓存实体。
明确适用场景:哪些页面必须用 fastcgi_no_cache
以下类型响应一旦被缓存,极易导致用户信息泄露、状态错乱或安全漏洞,应无条件排除:
- 含 Set-Cookie 头的页面(如登录页、密码修改页、会话初始化接口)
- URL 中带用户唯一标识的动态路径(如 /user/profile?uid=123 或 /order/history)
- POST/PUT/DELETE 请求(即使返回 HTML,也不该缓存)
- 响应中含 CSRF token、一次性验证码、实时时间戳等瞬态字段的页面
精准配置 fastcgi_no_cache 的三种可靠方式
关键不是“全局禁止”,而是按需、可验证地绕过缓存。推荐组合使用:
-
基于请求方法过滤:在 location ~ \.php$ 块中添加
fastcgi_no_cache $request_method !~ ^(GET|HEAD)$; -
基于 Cookie 或参数识别私有状态:例如用户已登录时跳过缓存
fastcgi_no_cache $cookie_php_sessionid;
fastcgi_no_cache $arg_token;
(变量非空即为 true,触发 no-cache) -
基于响应头特征主动拦截:配合 fastcgi_ignore_headers + 自定义逻辑
若 PHP 显式输出 Cache-Control: private 或 X-No-Cache: 1,可在 Nginx 中提取并判断:
fastcgi_no_cache $upstream_http_cache_control ~* "private";
fastcgi_no_cache $upstream_http_x_no_cache;
必须同步关闭的“缓存诱饵”行为
仅配 fastcgi_no_cache 不够,还需堵住其它可能引入缓存的路径:
- 禁用 fastcgi_cache_bypass 对私有请求的意外放行(避免误设为 always)
- 确认 fastcgi_cache_key 中不含易变字段(如 $cookie_user_id 或 $time_iso8601),否则看似绕过,实则生成海量无效缓存键,挤占 keys_zone 内存
- 检查 PHP 应用是否自行输出 Cache-Control: public —— 这类头会被 fastcgi_ignore_headers 屏蔽,但若未屏蔽,可能干扰 Nginx 缓存判定
验证是否真正生效
加一句调试头,直接看结果:
add_header X-Cache-Status "$upstream_cache_status";
访问目标页面,用 curl 或浏览器开发者工具查看响应头:
若返回 X-Cache-Status: BYPASS 或 X-Cache-Status: MISS(且无 HIT),说明 fastcgi_no_cache 已生效;若出现 HIT,则配置未覆盖到实际请求路径,需回溯匹配逻辑。











