fastcgi_cache_bypass仅决定当前请求是否跳过缓存读取,不控制缓存内容、不清理旧缓存、不影响其他请求;需与fastcgi_no_cache成对使用,并配合缓存键设计、后端响应头及主动purge机制实现动态缓存适配。

fastcgi_cache_bypass 不是“设置动态缓存规则”的指令,它只决定**当前请求是否跳过缓存读取**——也就是“不查缓存,直连 PHP”。它本身不控制缓存内容、不清理旧缓存、也不影响其他请求。真正让缓存“动态适配业务场景”,靠的是它和 fastcgi_no_cache、缓存键设计、后端响应头 以及 主动清理机制 的配合。
绕过缓存的常见触发条件
通常用变量组合表达“哪些请求不该走缓存”,最常用且安全的方式是:
-
有登录态就绕开:比如检测到
$cookie_PHPSESSID、$cookie_wordpress_logged_in或自定义用户标识 Cookie -
带调试参数就绕开:例如 URL 中含
?nocache=1或?preview,对应写成$arg_nocache、$arg_preview -
有敏感请求头就绕开:如
$http_pragma(值为no-cache)、$http_authorization(含 Bearer Token) -
匹配特定路径就绕开:配合
set $skip_cache 0;+ 多个 if 判断,比如后台、用户中心、API 接口等
必须搭配 fastcgi_no_cache 使用
只设 bypass 不够,否则 PHP 返回的内容仍可能被存进缓存,下次没 bypass 的请求就会拿到脏数据。正确写法是成对出现:
fastcgi_cache_bypass $cookie_PHPSESSID $arg_nocache $http_pragma; fastcgi_no_cache $cookie_PHPSESSID $arg_nocache $http_pragma;
只要任一变量非空(比如 cookie 存在或参数出现),两个指令同时生效:本次不读缓存、也不写缓存。
避免缓存污染的关键细节
绕过规则只是前端守门员,后端和缓存键设计同样重要:
-
缓存键别带用户标识:除非你真要做“千人千面缓存”,否则
fastcgi_cache_key不要包含$cookie_user_id,否则会缓存爆炸 -
忽略 PHP 输出的禁用头:加
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;,防止 PHP 自己发no-cache把 Nginx 缓存逻辑搞乱 -
静态资源单独处理:CSS/JS/图片等不要和 PHP 页面共用一套缓存策略,用独立 location 设置
expires max;或版本号控制
绕过 ≠ 刷新,发布新内容需另配 purge
管理员在后台发布文章,希望访客立刻看到新内容——这不能靠 bypass 实现。bypass 只让“这次请求”实时,但首页、列表页等已缓存的内容依然陈旧。必须额外配置:
- 一个受保护的
/purge接口,仅允许本地或管理员 IP 调用 - CMS 在发布成功时自动触发该接口,精准清除对应 URL 的缓存(如
/post/123) - 确保 purge 构造的 key 和缓存 key 完全一致,否则清不掉











