要让特定ip段请求不读也不写缓存,必须协同配置proxy_cache_bypass和proxy_no_cache,并用geo模块预定义$is_vip_ip变量(如192.168.50.0/24),在启用proxy_cache的location中成对使用该变量,再通过x-cache-status响应头和$upstream_cache_status日志验证byp状态。

要让特定用户 IP 段的请求直接绕过缓存(即不读缓存、也不写缓存),关键不是“禁用缓存”,而是用 proxy_cache_bypass 和 proxy_no_cache 双指令协同控制,且必须基于可信、不可伪造的标识——IP 段是最稳妥的选择之一。
用 geo 模块预定义 VIP IP 段变量
在 http{} 块顶部定义变量,高效又避免 if 性能问题:
geo $is_vip_ip {
default 0;
192.168.50.0/24 1;
2001:db8:200::/48 1;
10.200.10.100 1;
}
这个变量值为 1 表示该请求来自白名单 IP 段,后续可直接复用。
在 proxy location 中启用双控指令
确保缓存已开启的前提下,在对应 location(如反向代理后端的 PHP 或 API 接口)中配置:
-
proxy_cache mycache;(必须存在,否则 bypass 不生效) -
proxy_cache_bypass $is_vip_ip;→ 请求匹配白名单时跳过缓存查找 -
proxy_no_cache $is_vip_ip;→ 同样条件,禁止将响应写入缓存,防敏感数据污染
两个指令变量必须完全一致,且作用于同一 location,才能实现“不读 + 不存”的原子效果。
验证是否真正绕过
加日志和响应头便于确认生效:
- 在
log_format中加入$upstream_cache_status,VIP 请求应始终显示 BYP - 添加响应头:
add_header X-Cache-Status $upstream_cache_status;,浏览器或 curl 可直观看到X-Cache-Status: BYP - 发起测试请求:
curl -sI http://your-site.com/api/data,检查响应头和日志输出
注意真实 IP 的还原
若前端有 CDN、SLB 或 Nginx 反代,$remote_addr 默认是代理 IP。需提前配置:
-
set_real_ip_from 10.10.0.0/16;(填你所有可信代理网段) -
real_ip_header X-Forwarded-For;或X-Real-IP - 确保代理确实透传了真实 IP,否则
$is_vip_ip判的只是中间节点











