应同时配置 proxy_cache_bypass 和 proxy_no_cache 且条件一致,如 proxy_cache_bypass $http_authorization; proxy_no_cache $http_authorization;,并仅在启用缓存的 location 块中设置,配合 map 实现多维度身份识别,最终通过响应头 x-cache-status: byp 和日志字段 $upstream_cache_status 验证生效。

要让 Nginx 跳过特定管理端请求的响应缓存,关键不是只“不读缓存”,而是同时阻止响应写入缓存——否则管理员看到的新数据可能被缓存下来,后续无权限用户直接命中,造成信息泄露。必须用 proxy_cache_bypass 和 proxy_no_cache 配合使用,且两者条件完全一致。
只对管理路径启用,并绑定缓存区
管理接口通常有固定前缀(如 /admin/、/api/admin/),应在对应 location 块中显式启用缓存和绕过逻辑:
- 必须写
proxy_cache my_cache;(名称需与proxy_cache_path中的keys_zone一致) - 不能只在
http或server块里写proxy_cache_bypass,它不会继承到未启用缓存的 location - 示例配置片段:
proxy_cache my_cache;
proxy_pass http://backend;
# 其他必要代理头...
}
用 Authorization 头自动识别管理请求
绝大多数管理接口都带 Authorization: Bearer xxx,Nginx 的 $http_authorization 变量可直接提取该值:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
proxy_cache_bypass $http_authorization;→ 请求带非空 Authorization 头时,跳过缓存查找 -
proxy_no_cache $http_authorization;→ 同样条件下,禁止将本次响应写入缓存 - 无需前端加额外 header,也不依赖 URL 参数,运维用 curl 直接带 token 就能触发
- 注意:
$http_authorization必须全小写,短横不出现,大小写错误或写成$http_Authorization都会失效
更精细的控制:用 map 统一判断身份特征
如果管理请求还依赖 Cookie、角色头或 IP,推荐用 map 提前归一为布尔变量,再统一控制:
- 例如识别登录态:
map $cookie_sessionid $skip_cache { ~. 1; default 0; } - 识别角色:
map $http_x_user_role $skip_cache { "admin" 1; "ops" 1; default 0; } - 然后在 location 中写:
proxy_cache_bypass $skip_cache;和proxy_no_cache $skip_cache; - 所有 map 的
default必须是0,避免未匹配请求意外绕过
验证是否真正生效
不能只看配置,要结合响应头和日志确认行为:
- 发起带鉴权的请求:
curl -H "Authorization: Bearer abc" https://site.com/api/admin/users - 响应头中应含
X-Cache-Status: BYP(不是 HIT),且Age为 0 或缺失 - 检查 access log 中的
$upstream_cache_status字段,应显示BYP - 再用无头请求测试同一地址,应返回
HIT或MISS,证明普通流量不受影响










