带 token 的请求绝不能被缓存,否则会导致敏感数据泄露、越权访问或租户隔离失效;必须通过 proxy_cache_bypass 与 proxy_no_cache 配对控制,确保不读不写缓存,并杜绝 $http_authorization 等动态字段进入 cache_key 或响应头。

带 token 的请求(如 Authorization: Bearer xxx 或含 token=xxx 参数)通常代表用户身份、权限或会话状态,这类请求绝不能被缓存,否则极易导致敏感数据泄露、越权访问或租户隔离失效。处理的关键不是“能否绕过”,而是确保:只对合法 token 请求跳过缓存、不污染缓存池、且绕过行为不可被外部探测或滥用。
识别并触发绕过:用可信变量精准匹配
优先使用协议标准头或受控参数,避免依赖易伪造字段:
-
推荐用
$http_authorization:Nginx 原生支持,值为非空即触发(如Bearer abc123),无需额外 map;它难以被普通前端随意构造,且与认证流程强绑定 -
慎用
$arg_token:URL 中的 token 易被日志记录、代理截获、CDN 缓存,若必须支持,应配合 IP 白名单或时间戳签名校验,不能单独作为 bypass 条件 -
禁用
$host或$request_uri参与 bypass 判断:这些字段可被客户端任意篡改,用它们做条件等于开放绕过入口
读写双绕过:必须配对 proxy_cache_bypass 和 proxy_no_cache
仅跳过读缓存是危险的——后端返回的含用户数据响应仍可能被写入缓存,下次无 token 的请求就可能拿到他人信息:
- 在启用缓存的
location块中,同时配置:
proxy_no_cache $http_authorization $cookie_sessionid;
- 两个指令使用完全相同的变量组合,确保逻辑一致;Nginx 对
proxy_no_cache为 true 的响应,自动不写入缓存,也不添加Cache-Control: public等可传播头
防止缓存污染与越权暴露
绕过本身不是终点,要堵住所有可能让 token 请求结果进入共享缓存的路径:
-
检查
proxy_cache_key:确保 key 中不含$http_authorization或$arg_token——它们是动态且不可缓存的,加入 key 会导致缓存碎片化甚至冲突 -
关闭敏感响应头缓存传播:在
location中加proxy_hide_header Set-Cookie;和proxy_hide_header Authorization;,防止后端误透出凭证头 -
验证是否真未缓存:用带 token 的请求访问一次,再用无 token 的相同 URI 访问,响应内容必须不同;若一致,说明
proxy_no_cache未生效或 key 设计有缺陷
上线前必须做的安全收口
生产环境不允许存在“调试便利”换来的风险:
-
移除所有公开 bypass 参数:如
?nocache=1、?debug=true,上线配置中应彻底注释或 return 403 -
隐藏绕过痕迹:不返回
X-Bypass-Status、X-Cache-Debug等提示头;server_tokens off;已关闭,避免暴露 Nginx 版本 -
日志中脱敏 token:在 log_format 中避免记录
$http_authorization或$arg_token,可用mask模块或正则替换为[TOKEN]


















