map指令通过生成控制变量,配合proxy_cache_bypass和proxy_no_cache实现按条件开关缓存:前者跳过缓存查找,后者禁止写入缓存,常成对使用以确保“不查、不存”。

map 指令本身不直接开关 proxy_cache,但它能生成控制变量,配合 proxy_cache_bypass 和 proxy_no_cache 实现“按条件启用或禁用缓存”的效果。关键不是让 Nginx 停止读写缓存区,而是让特定请求绕过缓存逻辑、不落盘、不复用——这在灰度发布、登录态隔离、API 调试等场景中非常实用。
用 map 控制缓存开关的两种核心方式
实际配置中,最常用的是以下组合:
- proxy_cache_bypass $var:当 $var 非空且不为 0 / off / false 时,跳过缓存查找,直接向后端转发请求
- proxy_no_cache $var:当 $var 非空且不为 0 / off / false 时,即使响应本可缓存,也不写入缓存区
两者常成对使用,确保“不查、不存”,真正实现逻辑级关闭。
按用户身份动态开关缓存(如登录态)
适合需要对已登录用户返回个性化内容、禁止缓存的业务:
- 用 $cookie_session_id 或 $http_authorization 判断是否登录
- 未登录设为 "off"(触发 bypass/no_cache),已登录设为 ""(空值,不触发)
- 示例配置:
"" "off";
default ""; # 已登录用户不 bypass
}
然后在 location 中写:
阿里百炼大模型平台多人共享账号用量统计代理服务。解决公司共用账号时无法区分个人用量的问题。适用场景:1)部署用量统计代理;2)统计多人Token用量和调用次数;3)管理大模型API调用配额。
proxy_no_cache $bypass_cache;
按请求头类型开关缓存(如调试工具流量)
开发或运维常用 curl/httpie 发起请求,可统一识别并禁用缓存:
- 匹配 $http_user_agent 中的特征字符串
- 避免调试请求污染缓存,也防止缓存了错误响应
- 示例:
~*curl|httpie "1";
default ""; # 其他正常走缓存
}
再绑定到 proxy_cache_bypass 即可。
按 Content-Type 决定是否缓存响应体
有些接口返回 JSON 数据,内容实时性强,不适合缓存;而 HTML 页面可缓存较久:
- 注意:这里需依赖上游响应头中的 $sent_http_content_type
- 必须开启 proxy_pass_request_headers on 和 proxy_buffering on,否则该变量不可用
- 典型映射:
"application/json" "1";
default "";
}
后续同样接入 proxy_no_cache 和 proxy_cache_bypass。










