要使 proxy_no_cache 真正禁用缓存,必须配合 proxy_cache_bypass 并通过 map 指令将路径、请求头、cookie、参数等统一映射为 0/1 布尔变量,在启用 proxy_cache 的 location 中成对使用这两个指令;后端可通过 x-no-cache 响应头联动控制;default 必须设为 0,避免空值误判。

要让 proxy_no_cache 真正禁止特定请求被缓存,不能只写 proxy_no_cache 1 或直接引用原始变量(比如 $cookie_sessionid),必须配合 proxy_cache_bypass 并通过 map 指令将业务信号统一转为明确的 0/1 布尔变量,再在 location 中成对启用。
用 map 提前定义可复用的判断规则
把路径、请求头、Cookie、参数等特征映射为干净的开关变量,避免逻辑散落、误判或空值干扰:
- 按 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
这两个指令必须共用完全相同的变量列表,并且所在 location 已启用 proxy_cache,否则不生效:
-
proxy_cache my_cache;(缓存区名称需与proxy_cache_path中 keys_zone 一致) -
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(如用户带有效 session、请求含 ?nocache=true 或 Header 中有 X-User-Role: admin),整条请求就彻底脱离缓存链路。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
处理后端动态控制缓存的场景
如果后端应用(如 PHP/Node.js)需要自行决定某次响应不缓存,可通过返回 X-No-Cache: true 实现联动:
- 在 http 块中添加:
map $upstream_http_x_no_cache $no_cache_from_backend {<br> default 0;<br> ~*true 1;<br> ~*yes 1;<br>} - 在 location 中加入:
proxy_no_cache $no_cache_from_backend;
(可选)同时加proxy_cache_bypass $no_cache_from_backend;实现读写双跳过
后端只需在响应中设置对应 Header,Nginx 就能自动响应,无需每次改配置。
避坑要点
常见失效原因往往来自细节疏漏:
- default 必须设为 0:否则未匹配规则的请求可能被意外跳过
-
不要在 http 块中直接写
proxy_no_cache $cookie_sessionid:空 Cookie 是空字符串,Nginx 视为“非空”而触发,导致大量误跳 -
静态资源路径建议单独 location 处理:如
/static/、.js、.css,跳过所有个性化判断,专注用expires或proxy_cache_valid管理 -
验证是否生效看行为,不只看头:用 curl 检查
$upstream_cache_status是否为BYP,响应头中是否缺失X-Cache: HIT,同时确认后端确实收到请求










