要让 proxy_cache 真正支持动态不缓存,必须同时配置 proxy_cache_bypass 和 proxy_no_cache,并通过 map 预定义 0/1 变量;仅设 proxy_no_cache 会导致响应不存但可能读旧缓存;需在 location 中启用 proxy_cache 且变量列表完全一致。

要让 proxy_cache 真正支持动态不缓存,关键不是单独配 proxy_no_cache,而是让它和 proxy_cache_bypass 协同工作,并用 map 提前把业务信号转成统一的 0/1 变量。只设 proxy_no_cache 会导致响应不存,但请求仍可能从旧缓存里读出错误内容。
必须启用 proxy_cache 才能生效
proxy_no_cache 和 proxy_cache_bypass 都依赖缓存已开启:
- 在
location块中必须有proxy_cache my_cache;(名称需与proxy_cache_path的keys_zone一致) - 同时建议配置
proxy_cache_valid,明确哪些状态码可缓存
没有 proxy_cache,这两个指令会被 Nginx 忽略。
用 map 定义可复用的绕过开关
所有判断逻辑写在 http 块顶部,每个 map 输出 0 或 1,default 0 是硬性要求:
- 检测登录态:
map $cookie_sessionid $no_cache_by_login { ~. 1; default 0; } - 拦截后台路径:
map $request_uri $no_cache_by_path { ~*^/admin/ 1; ~*^/api/debug 1; default 0; } - 响应头触发(如后端返回
X-No-Cache: true):map $upstream_http_x_no_cache $no_cache_by_upstream { ~*true 1; default 0; } - 支持前端主动传参:
map $arg_nocache $no_cache_by_arg { "1" 1; "true" 1; default 0; }
location 中成对启用 bypass 和 no_cache
变量定义好后,在具体反代块里同时写两行,传入完全相同的变量列表:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_bypass $no_cache_by_login $no_cache_by_path $no_cache_by_upstream $no_cache_by_arg;
proxy_no_cache $no_cache_by_login $no_cache_by_path $no_cache_by_upstream $no_cache_by_arg;
proxy_cache_valid 200 302 10m;
}只要任意一个变量值为 1(比如用户带了有效 session、URL 含 /admin/、或后端返回了 X-No-Cache: true),这次请求就既不查缓存,也不存响应。
静态资源要单独处理,避免误卷入
对 /static/、.js、.css、/images/ 这类路径,另起 location 块,跳过上述所有 map 判断:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
# 不写 proxy_cache_bypass / proxy_no_cache,也不引入任何 map 变量
}这样既能保障静态资源高效缓存,又不会因登录态等变量污染其缓存行为。
不复杂但容易忽略

















