proxy_no_cache 是 Nginx 控制响应是否写入缓存的核心指令,依据请求头、Cookie、URL 参数等条件实现“或”逻辑的缓存绕过策略,支持通过 map 预处理实现精细控制。

proxy_no_cache 是 Nginx 反向代理中控制“是否跳过缓存写入”的核心指令,它不直接影响响应是否从缓存读取(那是 proxy_cache_bypass 的职责),而是决定:当后端返回可缓存响应时,Nginx 是否将其存入缓存区。结合请求头、参数、Cookie 等特征,可精准实现“某些请求不进缓存,但其他请求照常缓存”的策略。
根据请求头绕过缓存
常见于调试、灰度或带特殊标识的请求。例如,当客户端携带 X-No-Cache: 1 或 Cache-Control: no-store 时,禁止缓存该响应:
proxy_no_cache $http_x_no_cache $http_cache_control;
说明:
• $http_x_no_cache 自动映射请求头 X-No-Cache 的值(存在且非空时为 1,空或不存在为 "")
• $http_cache_control 映射 Cache-Control 头;只要任一变量非空(即头存在且非空字符串),整行条件成立,响应不写入缓存
• 注意:Nginx 对变量值做“空/非空”判断,不是正则或字符串匹配;若需更细粒度(如仅当 Cache-Control: no-store),应改用 map 指令预处理
根据 Cookie 实现用户级缓存隔离
登录态用户请求通常不应缓存(如个人中心页),而未登录用户可缓存首页。可通过检测 Cookie 中是否存在会话标识来绕过:
map $cookie_sessionid $no_cache_by_cookie {
~. 1; # sessionid 存在任意字符(即非空)→ 触发绕过
default 0;
}
proxy_no_cache $no_cache_by_cookie;
说明:
• 使用 map 将复杂逻辑转为布尔变量,避免在 proxy_no_cache 中写正则
• ~. 表示“匹配任意一个字符”,等效于“非空”判断;若需精确匹配 sessionid=abc123,可用 ~^abc123$
• 此方式不影响匿名用户请求的缓存命中,仅对带有效 session 的请求禁写缓存
根据 URL 参数动态控制缓存写入
开发环境常通过 ?debug=1 或 &v=xxx 强制刷新内容,此时应跳过缓存存储:
map $args $no_cache_by_arg {
~debug=1 1;
~v=[^&]+ 1;
default 0;
}
proxy_no_cache $no_cache_by_arg;
说明:
• $args 是完整查询字符串(如 a=1&b=2&debug=1),正则可跨参数匹配
• ~debug=1 匹配任意位置出现 debug=1;~v=[^&]+ 匹配 v= 后跟非 & 字符(防误匹配 v=1&v=2)
• 若多个参数共存(如 ?debug=1&v=2),任一匹配即生效,无需叠加判断
组合多种条件实现精细策略
实际场景常需多条件“与”或“或”逻辑。Nginx 中 proxy_no_cache 对所有变量执行“或”判断(任一非空即绕过),因此组合本质是“满足任一条件即不缓存”。如同时要求:
– 请求来自内网 IP(调试机)
– 或携带特定 Header
– 或 Cookie 中含 admin 标识
geo $is_internal {
default 0;
192.168.0.0/16 1;
10.0.0.0/8 1;
}
<p>map $cookie_role $no_cache_admin {
~admin 1;
default 0;
}</p><p>proxy_no_cache $is_internal $http_x_debug $no_cache_admin;</p>说明:
• geo 指令生成客户端 IP 分类变量,比用 if 更高效安全
• 所有变量并列写在 proxy_no_cache 后,语义为“只要内网访问、或带 X-Debug、或角色为 admin,就不写缓存”
• 不支持“且”逻辑(如“必须同时带 header 且是内网 IP”),此时需用 map 构造复合变量


















