要真正禁用特定资源缓存,必须同时配置 proxy_cache_bypass 和 proxy_no_cache 并共用同一组 map 生成的布尔变量(如 $no_cache_by_path),前者跳过缓存查找,后者阻止响应写入缓存;需用 map 指令将路径、请求头、Cookie、参数等映射为 0/1 变量,在 location 中成对启用双指令,任一变量为 1 即彻底绕过缓存。

要真正禁用特定资源缓存,不能只靠 proxy_no_cache 单独工作——它只管“不存”,不管“不读”。必须配合 proxy_cache_bypass,二者共用同一组变量,才能实现请求跳过缓存查找、响应也不写入缓存的完整绕过。
用 map 提前提取业务特征,生成开关变量
把路径、请求头、Cookie、参数等信号统一转为 0/1 变量,逻辑清晰且便于复用:
- 按 URL 路径跳过:比如后台接口、调试路径
map $request_uri $no_cache_by_path {<br> ~*^/admin/ 1;<br> ~*^/api/debug 1;<br> default 0;<br>} - 按请求头识别角色:
map $http_x_user_role $no_cache_by_role {<br> "admin" 1;<br> "dev" 1;<br> default 0;<br>} - 按 Cookie 判断登录态(避免缓存用户私有内容):
map $cookie_sessionid $no_cache_by_login {<br> ~. 1;<br> default 0;<br>} - 按查询参数主动触发:
map $arg_nocache $no_cache_by_arg {<br> "1" 1;<br> "true" 1;<br> default 0;<br>}
在 location 中成对启用 bypass 和 no_cache
变量定义好后,在具体转发块里同时启用两个指令,传入完全相同的变量列表:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
proxy_cache_bypass $no_cache_by_path $no_cache_by_role $no_cache_by_login $no_cache_by_arg;→ 请求阶段跳过缓存查找,直连后端 -
proxy_no_cache $no_cache_by_path $no_cache_by_role $no_cache_by_login $no_cache_by_arg;→ 响应阶段禁止写入缓存,防止敏感内容污染
只要其中任意一个变量值为 1(例如请求带 X-User-Role: admin 或 URL 含 ?nocache=true),整条请求就彻底脱离缓存链路。
处理上游返回的 X-No-Cache 响应头
后端应用可动态决定某次响应不应缓存,比如 PHP 返回 header('X-No-Cache: true');:
- 先在
http块中映射上游响应头:map $upstream_http_x_no_cache $no_cache_flag {<br> default 0;<br> ~*true 1;<br> ~*yes 1;<br>} - 再在 location 中启用:
proxy_no_cache $no_cache_flag;<br>proxy_cache_bypass $no_cache_flag;
注意:$upstream_http_x_no_cache 对应的是 X-No-Cache 响应头,Nginx 自动将其转为小写下划线格式。
避坑要点
- default 必须设为 0:防止未匹配规则的请求被误跳过,影响正常缓存命中
-
静态资源单独处理:如
/static/、/images/等路径建议用独立location块,不参与上述 map 判断,直接配置expires或proxy_cache_valid -
不要在 http 块直接写
proxy_no_cache $cookie_sessionid:空 Cookie 可能导致非预期行为;务必通过map显式控制 -
验证是否生效:用
curl -I检查响应头中无X-Cache: HIT,且$upstream_cache_status为BYP

















