proxy_cache_bypass控制是否跳过缓存查找,proxy_no_cache控制响应是否写入缓存;二者需用相同变量(如$skip_cache)协同工作,配合map指令按路径、请求头、参数等业务维度精准控制缓存行为。

Nginx 的 proxy_no_cache 本身不直接“跳过缓存读取”,它只决定响应是否写入缓存。要实现“基于业务变量精准剔除、不缓存”,必须配合 proxy_cache_bypass,并用变量驱动逻辑判断——不是简单写 proxy_no_cache 1,而是让变量成为缓存策略的开关。
关键原理:两个指令分工明确
-
proxy_cache_bypass:控制是否跳过缓存查找(即是否向上游发请求) -
proxy_no_cache:控制返回的响应是否存入缓存(即是否丢弃本次响应的缓存机会)
二者常成对使用,变量值一致时语义才统一。比如都用 $skip_cache,值为非空/非零时,既绕过缓存读取,又拒绝缓存新响应。
基于业务变量的典型配置方式
✅ 用 map 提前定义业务规则,清晰解耦
# 根据 URL 路径判断(如后台、调试接口)
map $request_uri $skip_cache_by_path {
~*^/admin/ 1;
~*^/api/v1/debug 1;
~*^/healthz 1;
default 0;
}
# 根据请求头判断角色(如管理员、测试人员)
map $http_x_user_role $skip_cache_by_role {
"admin" 1;
"dev" 1;
default 0;
}
# 根据查询参数灵活触发(前端加 ?nocache=1 即生效)
map $arg_nocache $skip_cache_by_arg {
"1" 1;
"true" 1;
default 0;
}
✅ 在 location 中统一启用缓存绕过逻辑
location / {
proxy_pass http://backend;
# 同时启用 bypass 和 no_cache,变量任意一个为 1 就触发
proxy_cache_bypass $skip_cache_by_path $skip_cache_by_role $skip_cache_by_arg;
proxy_no_cache $skip_cache_by_path $skip_cache_by_role $skip_cache_by_arg;
# 其他缓存基础配置(如 keys_zone、valid 等需已定义)
proxy_cache my_cache;
proxy_cache_key $host$uri$is_args$args;
}
⚠️ 注意:
proxy_cache_bypass和proxy_no_cache接收多个变量,只要任一变量值为非空字符串或非零数值,整条指令即视为“真”,触发对应行为。
实际业务场景举例
- 用户带
X-User-Role: admin头访问/dashboard→ 绕过缓存,且响应不落盘 - 请求
/api/v1/data?nocache=true→ 触发$skip_cache_by_arg→ 不查缓存、不存缓存 - 普通用户访问
/public/article,无匹配规则 → 正常走缓存读写流程
这种设计把“什么该跳过”从配置里抽离成可维护的 map 块,新增规则只需改 map,不碰主逻辑。
补充:避免常见误区
- ❌ 单独用
proxy_no_cache $arg_nocache;无法跳过缓存命中 —— 它只影响写入,不影响查找 - ❌ 不要在
if块里设proxy_cache_bypass—— Nginx 不允许在if中使用该指令 - ❌
proxy_no_cache的变量值不能是空格或纯空白字符串,否则会被视作 false;推荐用"1"/"0"或明确字符串如"yes"/"no"
不复杂但容易忽略。










