proxy_no_cache 本身不跳过缓存查找,仅控制响应是否写入缓存;必须配合 proxy_cache_bypass 才能真正实现动态绕过缓存,且需通过 map 指令将 cookie、header 等请求特征转为布尔变量后引用。

proxy_no_cache 是 Nginx 反向代理中控制“是否跳过缓存”的核心指令,它本身不直接判断请求头,但可以配合 map 指令,基于任意请求头(如 Cookie、Authorization、X-Disable-Cache 等)动态生成布尔变量,再交由 proxy_no_cache 使用 —— 实现精准、灵活的按需绕过缓存。
用 map 提取请求头逻辑为缓存开关变量
Nginx 不允许在 proxy_no_cache 中直接写条件表达式,必须先用 map 将复杂判断转为简单值(通常是 0/1 或空字符串/非空字符串)。例如:
map $http_cookie $skip_cache_by_cookie {
~*wordpress_logged_in 1;
~*PHPSESSID 1;
default 0;
}
<p>map $http_authorization $skip_cache_by_auth {
"" 0; # 无认证头 → 可缓存
default 1; # 有认证头 → 跳过缓存
}</p><p>map $http_x_disable_cache $skip_cache_by_header {
"1" 1;
"true" 1;
default 0;
}</p>注意:map 块必须定义在 http 块中,且变量名不能与内置变量冲突;正则匹配用 ~*(忽略大小写),空字符串用 "" 表示。
在 location 中组合多个跳过条件
可将多个 map 变量合并为一个最终开关,例如只要任一条件命中就跳过缓存:
map "$skip_cache_by_cookie:$skip_cache_by_auth:$skip_cache_by_header" $skip_cache {
~1 1;
default 0;
}
或更清晰地用 set(需启用 ngx_http_rewrite_module)在 location 内计算(Nginx ≥ 1.19.0 支持 if 多条件,但推荐用 map):
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
然后在 proxy 配置中引用:
location / {
proxy_pass http://backend;
proxy_cache my_cache;
<pre class="brush:php;toolbar:false;"># 当 $skip_cache 为非空字符串(如 "1")时,跳过缓存
proxy_no_cache $skip_cache;
proxy_cache_bypass $skip_cache;
# 其他缓存相关设置...
proxy_cache_valid 200 302 10m;}
proxy_no_cache 和 proxy_cache_bypass 通常一起用:
– proxy_no_cache:不将响应存入缓存;
– proxy_cache_bypass:不从缓存取响应,直接转发给后端。
常见实用场景与配置建议
-
登录用户绕过缓存:检测
Cookie中是否存在会话标识(如sessionid=、auth_token=),匹配即设为 1 -
调试时临时禁用缓存:约定请求头
X-Disable-Cache: 1,前端或 curl 测试时手动添加 -
API 请求区分缓存策略:对
Content-Type: application/json且含Authorization的请求统一跳过缓存 -
避免误缓存错误响应:结合
proxy_cache_valid 404 1s+proxy_no_cache $upstream_http_content_type过滤掉非 HTML/JSON 响应的缓存
验证与调试技巧
开启 proxy_cache_debug on(仅开发环境),并在响应头中添加调试信息:
add_header X-Cache-Status $upstream_cache_status; add_header X-Skip-Cache $skip_cache; add_header X-Cookie-Match $skip_cache_by_cookie;
用 curl -I 查看响应头,确认变量值是否符合预期。注意:$upstream_cache_status 为 BYPASS 表示触发了 proxy_cache_bypass,MISS 表示未命中缓存但未绕过,HIT 表示成功命中。










