缓存绕过需用map组合多条件生成布尔开关,再同步配置proxy_cache_bypass和proxy_no_cache以跳过读写缓存;所有map须定义在http块,变量名用下划线,避免key冲突。

缓存绕过要支持多个条件(比如“是 API 路径 且 请求方法为 POST 且 携带特定 Cookie”),不能靠单个指令硬编码,必须用 map 把多个变量组合成一个布尔型开关,再交给 proxy_cache_bypass 和 proxy_no_cache 同时控制读和写。
用 map 合并多个请求特征生成统一开关
map 指令本身不支持逻辑运算符(如 &&、||),但可以通过嵌套 map 或按优先级顺序匹配,把多个条件“压缩”成一个变量。常见做法是:先分别提取各维度特征,再用一个顶层 map 做组合判断。
- 先定义基础变量:
例如用map $request_uri $is_api { ~*/api/ 1; default 0; }判断是否 API 路径;
再用map $request_method $is_write_method { POST 1; PUT 1; DELETE 1; default 0; }判断是否写操作方法 - 再组合成最终开关:
map "$is_api:$is_write_method:$http_x_forwarded_for" $skip_cache {<br> "1:1:127.0.0.1" 1;<br> "1:1:" 1;<br> default 0;<br>}
这里用冒号拼接多个变量值,形成唯一标识;支持精确匹配(如本地调试 IP)或模糊匹配(空值表示任意)
配合 proxy_cache_bypass 和 proxy_no_cache 双向生效
只设 proxy_cache_bypass 1 只跳过读缓存,但响应仍可能被写入缓存——这会导致下次非绕过请求误命中脏数据。真正“绕过整个缓存生命周期”,必须两者并用:
-
proxy_cache_bypass $skip_cache;:值为非空、非 0、非 “off” 时,本次请求不查缓存,直接回源 -
proxy_no_cache $skip_cache;:值同上时,本次响应不存入缓存,彻底避免污染 - 两个指令必须出现在同一个
location块内,且变量必须已通过 map 提前定义在http块中
进阶:用 map 实现灰度或环境隔离绕过
除了路径+方法,还可引入更灵活的触发条件,比如:
- 根据 Cookie 控制:用
map $http_cookie $is_gray_user { ~*uid=abc123 1; default 0; } - 根据请求头识别测试环境:
map $http_x_env $is_test_env { "staging" 1; "dev" 1; default 0; } - 组合时注意顺序:把高确定性条件放前面,避免 default 提前截断;例如
map "$is_api:$is_gray_user" $skip_cache { "1:1" 1; "1:0" 0; default 0; }
关键细节不能漏
绕过逻辑看似简单,但几个细节出错就会失效:
- 所有 map 必须定义在
http块,不能写在 server 或 location 内 - 变量名不要用短横线(如
$skip-cache),Nginx 不认;推荐下划线命名 - 如果用了
proxy_cache_key,建议显式包含业务维度(如加$skip_cache后缀),避免绕过请求和普通请求 key 冲突 - 绕过生效后,可通过响应头
X-Cache: MISS或日志确认,而不是仅看返回内容











