关键是要用proxy_cache_bypass条件跳过读缓存,必须与proxy_cache、proxy_no_cache同location成对配置,变量非空且不为"0"/"off"即触发,且需通过响应头x-cache-status:byp和日志$upstream_cache_status=byp验证生效。

要让特定请求跳过 Nginx 缓存、直连后端,关键不是“关掉缓存”,而是用 proxy_cache_bypass 做条件判断——满足条件时跳过读缓存,其余请求照常走缓存。它必须和 proxy_cache 成对出现在同一个 location 块中,单独配置无效。
必须配齐的基础结构
绕过缓存不是加一行指令就能生效,需要三个要素同时存在:
- 在
http块里已定义缓存区:proxy_cache_path /path/to/cache levels=1:2 keys_zone=mycache:10m; - 在目标
location中启用缓存:proxy_cache mycache;(名称必须与keys_zone一致) - 在同一
location中写入:proxy_cache_bypass指令,并传入合法变量
常用触发条件写法
该指令接收一个或多个变量,任意一个值为非空且不等于 "0" 或 "off",即触发绕过。常见组合有:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 用自定义请求头识别开发请求:
proxy_cache_bypass $http_x_bypass_cache;前端或 curl 加-H "X-Bypass-Cache: 1"即可绕过 - 用查询参数快速测试:
proxy_cache_bypass $arg_nocache;访问/api/data?nocache=1就跳过缓存 - 用 Cookie 区分内部人员:
proxy_cache_bypass $cookie_dev_mode;浏览器设置dev_mode=1的 Cookie 后自动生效 - 按 IP 白名单限制:
proxy_cache_bypass $remote_addr ~^(192\.168\.|10\.)只允许内网地址触发绕过(需配合set预处理变量)
防止响应被错误缓存(双保险)
proxy_cache_bypass 只控制“不读缓存”,默认仍会把后端返回的响应写入缓存。调试中的敏感数据一旦被缓存,可能被普通用户误命中。所以务必同步配置:
proxy_no_cache $http_x_bypass_cache;proxy_cache_bypass $http_x_bypass_cache;
两个指令使用同一变量,确保既不查旧缓存,也不存新响应。这是生产环境必须的防护措施。
验证是否真正生效
不能只看配置是否写对,要通过真实请求确认行为:
- 发起带触发条件的请求,例如:
curl -H "X-Bypass-Cache: 1" https://example.com/api/status - 检查响应头:
X-Cache-Status: BYP(需提前配置add_header X-Cache-Status $upstream_cache_status;) - 查看 Nginx 日志字段
$upstream_cache_status,应为BYPASS,而不是HIT或MISS










