Nginx 的 fastcgi_cache_bypass 通过变量值非空(如 Cookie、URL 参数、路径匹配等)决定是否跳过缓存,常用于登录态、调试、后台路径、认证头或后端主动通知等场景,实现精准缓存控制。

要让 Nginx 的 fastcgi_cache_bypass 真正按需跳过缓存,关键不是“加指令”,而是让变量值在特定条件下变成非空字符串(如 "1"、"true" 或任意非空 Cookie 值)。它本身不删缓存,只决定“这次请求要不要查缓存”。
基于用户登录态绕过
登录用户看到的内容往往因身份而异(如个人中心、购物车),缓存通用版本会出错。最常用方式是检测 PHP Session Cookie:
- 在
location ~ \.php$块中添加:fastcgi_cache_bypass $cookie_PHPSESSID;fastcgi_no_cache $cookie_PHPSESSID; - 只要浏览器携带
PHPSESSIDCookie(即已登录),该请求就既不读缓存也不写缓存 - 若用其他 Session 名(如 WordPress 的
wordpress_logged_in_*),可改用正则匹配:set $skip_cache 0;if ($http_cookie ~* "wordpress_logged_in_") { set $skip_cache 1; }fastcgi_cache_bypass $skip_cache;fastcgi_no_cache $skip_cache;
基于 URL 参数临时跳过
适合调试、预览或运营临时需求,无需改代码,访问时加参数即可生效:
- 配置示例:
fastcgi_cache_bypass $arg_nocache $arg_preview $arg_debug;fastcgi_no_cache $arg_nocache $arg_preview $arg_debug; - 访问
/article/123?preview=1或?nocache时自动绕过 - 多个参数用空格分隔,任一存在(值非空)即触发 bypass
基于请求路径精准控制
后台、API 接口、实时数据页通常不该缓存,直接按路径规则拦截更可靠:
- 推荐写法(避免 if 嵌套):
set $skip_cache 0;if ($request_uri ~* "^/(wp-admin|admin|api/order|dashboard)") { set $skip_cache 1; } - 也可结合 HTTP 头判断,比如带认证头的请求:
fastcgi_cache_bypass $http_authorization $http_pragma;
当请求含Authorization或Pragma: no-cache时跳过
配合后端主动通知绕过
让 PHP 脚本自己决定哪些响应不该缓存,灵活性更高:
- PHP 中输出:
header('X-No-Cache: 1');或setcookie('nocache', '1'); - Nginx 中捕获:
fastcgi_cache_bypass $upstream_http_x_no_cache $cookie_nocache; - 注意:
$upstream_http_*只能获取响应头,需确保fastcgi_ignore_headers不屏蔽该头


















