要实现黑白名单式敏感数据缓存隔离,需构建“识别+绕过+隔离”三层逻辑:先用map将UID、Header、Cookie等转为布尔变量并default设0,再成对配置proxy_cache_bypass和proxy_no_cache触发双拦截,最后用白名单路径显式放行保障缓存友好性。

要让 proxy_no_cache 真正支撑黑白名单式的敏感数据缓存隔离,关键不是只写一个指令,而是构建“识别 + 绕过 + 隔离”三层逻辑:先用 map 明确标出哪些请求属于“黑(需拦截)”,再用 proxy_cache_bypass 和 proxy_no_cache 成对生效,确保这类请求既不读缓存也不写缓存;同时把“白(可缓存)”设为默认行为,避免误伤。
用 map 构建黑白名单识别变量
黑白名单本质是条件判断,Nginx 不支持 if 嵌套或复杂逻辑,必须靠 map 提前将原始字段转为布尔值。每个 map 对应一类规则,default 必须为 0(即“默认允许缓存”):
- 黑名单用户(如特定 UID 或角色):
map $arg_uid $no_cache_by_uid { "1001" 1; "2005" 1; default 0; } - 黑名单 Header(如调试头、内部测试标记):
map $http_x_debug_mode $no_cache_by_debug { "on" 1; "true" 1; default 0; } - 黑名单 Cookie(如含 admin_session 的会话):
map $cookie_admin_session $no_cache_by_admin_cookie { ~. 1; default 0; } - 白名单路径(显式放行,如公开 API):
map $request_uri $cache_allowed_path { ~*^/api/public/ 1; ~*\.json$ 1; default 0; }(注意:这个变量用于反向控制,后续配合取反逻辑)
成对启用 bypass 和 no_cache 实现双拦截
proxy_no_cache 单独存在时,只影响响应是否存入缓存,但请求仍可能命中旧缓存返回错误内容。真正隔离必须让请求阶段就跳过查找——这靠 proxy_cache_bypass。两者必须传入完全相同的变量列表,且任一变量值为非空(如 1)即触发:
location /api/ {<br> proxy_cache my_cache;<br> proxy_cache_bypass $no_cache_by_uid $no_cache_by_debug $no_cache_by_admin_cookie;<br> proxy_no_cache $no_cache_by_uid $no_cache_by_debug $no_cache_by_admin_cookie;<br>}
这样,只要用户 UID 是 1001,或带 X-Debug-Mode: on,或 Cookie 含 admin_session,整条请求就彻底脱离缓存链路:不查、不存、不返回缓存副本。
阿里百炼大模型平台多人共享账号用量统计代理服务。解决公司共用账号时无法区分个人用量的问题。适用场景:1)部署用量统计代理;2)统计多人Token用量和调用次数;3)管理大模型API调用配额。
用白名单路径反向保障缓存友好性
仅靠黑名单可能漏掉边缘情况(比如未登录用户无 UID 参数,但 UA 是爬虫)。更稳妥的做法是定义“明确可缓存”的白名单路径,并在 location 中优先匹配:
location ~* ^/api/public/ {<br> proxy_cache my_cache;<br> proxy_cache_valid 200 5m;<br> # 不设 proxy_cache_bypass / proxy_no_cache,默认走缓存<br>}
再配合全局默认 location 处理其余路径,把黑名单逻辑放在里面。这样白名单路径天然绕过所有黑名单判断,无需额外变量控制,结构清晰、不易冲突。
避开常见误配置陷阱
很多问题源于变量作用域和默认值失控:
- 所有
map的default必须显式写 0,不能省略——否则空值、缺失字段可能被隐式转为非零,导致全量请求绕过缓存; - 不要在
http块直接写proxy_no_cache $cookie_sessionid——空 cookie 字符串会被当真值,使未登录用户也被拦截; - 静态资源路径(如
/static/、/images/)应单独配置 location,跳过所有 map 判断,只用expires或proxy_cache_valid管理,避免个性化逻辑污染基础资源; - 测试时用
curl -I查看响应头中的X-Cache和Age,确认是否真正绕过或命中缓存。

















