要实现 proxy_no_cache 的黑白名单隔离,必须配合 proxy_cache_bypass 使用 map 指令生成布尔变量:黑名单 ip、非白名单角色、敏感路径任一命中即绕过缓存且不写入,静态资源需单独 location 放行缓存。

要让 proxy_no_cache 真正支撑黑白名单式的数据隔离,关键不是单独设它,而是把它和 proxy_cache_bypass 配合使用,并通过 map 指令把黑白名单逻辑转成可判断的布尔变量。敏感集群数据(比如带用户身份、权限、设备特征的请求)必须“读不查缓存、写不进缓存”,双管齐下才安全。
用 map 构建黑白名单识别变量
黑白名单不能硬编码在 location 里,得统一用 map 提取请求特征生成开关变量,所有 default 0 是底线——默认走缓存,只对明确命中规则的请求干预:
- 黑名单 IP:用
$remote_addr匹配禁止访问的地址段map $remote_addr $no_cache_by_blacklist {<br> "192.168.10.5" 1;<br> "10.20.30.0/24" 1;<br> default 0;<br>} - 白名单角色头:只允许特定 header 的请求走缓存,其余绕过
map $http_x_user_role $no_cache_by_whitelist {<br> "guest" 0;<br> "user" 0;<br> default 1; # 非白名单角色一律不缓存<br>} - 敏感路径:如后台接口、调试路由、含 token 的 API
map $request_uri $no_cache_by_path {<br> ~*^/admin/ 1;<br> ~*^/api/v2/user/profile 1;<br> ~*token= 1;<br> default 0;<br>}
location 中必须成对启用 bypass 和 no_cache
这两个指令要传入完全相同的变量列表,Nginx 规则是“任一变量值为非空(即 1),就立即生效”:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
proxy_cache_bypass $no_cache_by_blacklist $no_cache_by_whitelist $no_cache_by_path→ 请求进来时跳过缓存查找,直连后端 -
proxy_no_cache $no_cache_by_blacklist $no_cache_by_whitelist $no_cache_by_path→ 响应返回时不写入缓存,避免污染
只要用户 IP 在黑名单里、或角色不在白名单中、或访问了 /admin/,整条链路就彻底脱离缓存体系。
避免误伤静态资源与匿名流量
黑白名单逻辑只该作用于动态敏感接口,静态资源(如 /static/、/images/)和未携带识别信息的请求必须放行缓存:
- 所有
map的default必须是0,防止空$http_x_user_role或缺失 header 被误判为需绕过 - 不要在
http块全局写proxy_no_cache $cookie_sessionid,空 session ID 字符串也会触发绕过 - 为静态路径单独配置
location,跳过上述 map 判断:location ^~ /static/ {<br> proxy_cache_valid 200 1h;<br> expires 1h;<br> # 不设 proxy_cache_bypass / proxy_no_cache<br>}
验证与上线前检查点
上线前务必确认三点:
- 用
curl -I查响应头,命中绕过逻辑的请求应无X-Cache: HIT,且带Vary头体现个性化维度 - 检查 Nginx error log,确认没有
map变量未定义或正则语法错误 - 对白名单角色做压测,确保缓存命中率回升;对黑名单 IP 尝试请求,确认始终回源且响应时间稳定










