在 nginx 中配置缓存绕过,核心方法是使用 proxy_cache_bypass 指令,它通过检查指定的变量值来决定是否跳过缓存读取并直接向源站发起请求。具体做法是在 location 块中设置该指令,例如传入 $http_authorization 或自定义的 $bypass_cookie,当这些变量的值为非零且非 "0" 字符串时,nginx 将不会从缓存中获取响应,而是重新向后端请求内容并更新缓存。

如何根据 Cookie 实现特定用户的缓存绕过
要实现基于 Cookie 的缓存绕过,只需在 proxy_cache_bypass 中引用包含该 Cookie 值的变量即可。通常结合 map 模块将 Cookie 字符串映射为布尔标志,或者直接使用 $cookie_name 变量。当用户携带特定的标识 Cookie 时,Nginx 会判定缓存失效条件成立,从而绕过缓存直接回源。

server {
listen 80;
server_name example.com;
# 定义缓存区域
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_cache:10m;
location /api/ {
proxy_pass http://backend;
# 启用缓存
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 如果 cookie 中包含 bypass=1,则绕过缓存
proxy_cache_bypass $cookie_bypass;
# 同时设置不存储带有 bypass 的请求结果(可选)
proxy_no_cache $cookie_bypass;
}
}
在上述配置中,当请求头包含 Cookie: bypass=1 时,$cookie_bypass 的值为 "1",满足非零条件,Nginx 将忽略缓存并直接向 http://backend 发起请求。对于普通请求,该变量为空,不满足绕过条件,Nginx 正常返回缓存内容。
如何通过 Header 动态控制缓存绕过
除了 Cookie,利用 HTTP Header 也是常见的绕过方式,特别适用于调试或管理场景。通过在 proxy_cache_bypass 中指定如 $http_x_cache_control 等变量,可以实现前端或客户端主动请求刷新。只要 Header 中的值不为空且不为 "0",Nginx 就会执行回源操作。

# 测试用脚本示例:curl -H "X-Cache-Control: no-cache" http://example.com/api/ # 此时 Nginx 会绕过缓存,直接从后端获取最新数据 # 常规请求:curl http://example.com/api/ # Nginx 返回缓存的旧数据
这种方式的灵活性在于无需修改 Cookie 或依赖复杂的 URL 参数,只需在请求头中添加特定字段即可触发绕过逻辑。需要注意的是,proxy_cache_bypass 仅控制是否读取缓存,若希望此次回源的结果也不被缓存,需配合 proxy_no_cache 指令使用,否则新的响应仍会被写入缓存供后续请求使用。
当 proxy_cache_bypass 和 proxy_no_cache 同时存在时如何处理
当 proxy_cache_bypass 和 proxy_no_cache 同时配置时,Nginx 的处理逻辑是“或”关系。只要其中任意一个指令的条件满足(即对应变量值为非零且非 "0"),Nginx 就会跳过缓存读取并禁止将当前响应存入缓存。这意味着两者同时生效时,不仅当前请求回源,而且该次回源的结果也不会被缓存,常用于强制实时获取且不保留的场景。


















