Nginx 为不同用户角色生成独立缓存键的关键是将归一化后的角色标识(如 $cache_role)作为 proxy_cache_key 的稳定维度,配合 map 指令处理空值与非法输入,并通过 proxy_cache_bypass 和 proxy_no_cache 实现管理员请求不缓存。

要在 Nginx 中为不同用户角色(如普通用户、VIP、管理员)生成独立缓存键,关键不是“识别角色后写逻辑”,而是把角色信息作为缓存键的稳定输入维度——前提是后端已通过 Cookie、Header 或参数将角色标识可靠地传递到 Nginx 层。
确保角色标识可被 Nginx 读取
角色信息必须以 Nginx 能直接提取的方式存在,常见方式有:
-
Cookie 方式:后端在登录/鉴权后写入
role=premium或user_type=admin等明确字段 -
请求头方式:网关或前端注入
X-User-Role: vip(需确认该 Header 不被 Nginx 默认丢弃,必要时用proxy_pass_request_headers on) -
URL 参数方式:仅限调试或低敏感场景,如
?role=guest,但不推荐用于生产(易被篡改、污染日志)
用 map 指令标准化角色值并防空/非法输入
直接拼接原始 Cookie 或 Header 容易因格式不一导致键碎片化(如 role="vip" vs role=vip)。建议先用 map 统一归一化:
map $cookie_role $cache_role {
"" "_guest";
"basic" "_basic";
"premium" "_premium";
"admin" "_admin";
default "_guest";
}
这样无论 Cookie 是否缺失、值是否为空或非法,$cache_role 总会输出一个确定、安全、带前缀的字符串,避免键爆炸。
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
构建含角色维度的 cache_key
将归一化后的角色变量加入 proxy_cache_key,同时保留其他必要维度(协议、方法、主机、路径、参数),例如:
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args$cache_role";
效果是:
- 同一 URL 下,
role=basic和role=premium的响应分别存入不同缓存槽位 - 未登录用户(
$cookie_role为空 →$cache_role = "_guest")也有专属缓存,不与他人混用 - 即使后端返回相同内容,Nginx 也按角色隔离存储,彻底规避“VIP 看到普通用户缓存页”的风险
配合缓存开关策略防止误存
仅靠 key 分离还不够——若管理员请求也进了缓存,后续普通用户可能意外命中。应同步启用保护机制:
-
跳过缓存:
proxy_cache_bypass $cookie_admin;—— 管理员 Cookie 存在即穿透,不查也不存 -
禁止写入:
proxy_no_cache $cookie_admin $arg_debug;—— 即使响应本可缓存,有 admin 或 debug 参数就不落盘 - 二者常共用,形成“读绕过 + 写拦截”双保险

















