map块通过匹配$http_content_type等变量动态生成$cache_ttl、$cache_type等新变量,供proxy_cache_valid和proxy_cache_key等指令使用,实现按content-type差异化缓存。

理解 map 块在缓存控制中的作用
map 是 Nginx 中用于条件映射的指令,它不直接处理请求,而是根据某个变量(如 $http_content_type)的值,动态生成一个新的变量(如 $cache_key_suffix 或 $cache_ttl)。这个新变量后续可被 proxy_cache_valid、proxy_cache_key 或 add_header 等指令使用,实现“按 Content-Type 差异化缓存”。
定义基于 Content-Type 的缓存策略变量
在 http 块中声明 map,区分常见类型并设置对应缓存行为:
map $http_content_type $cache_ttl {
default 1m;
~*^application/json$ 5m;
~*^text/html$ 10m;
~*^image/(png|jpg|jpeg|gif|webp)$ 1h;
~*^application/javascript$ 30m;
~*^text/css$ 30m;
}
map $http_content_type $cache_type {
default "_generic";
~*^application/json$ "_json";
~*^text/html$ "_html";
~*^image/ "_image";
~*^application/javascript$ "_js";
~*^text/css$ "_css";
}
注意:~* 表示忽略大小写的正则匹配;$http_content_type 是客户端请求头中实际携带的值(可能为空或不规范),因此 default 分支必不可少。
在 location 中应用 map 变量控制缓存
将 map 结果接入 proxy_cache 配置。假设已定义名为 my_cache 的缓存区:
proxy_cache my_cache; proxy_cache_valid 200 302 $cache_ttl; # 关键:用变量替代固定时间 proxy_cache_key "$scheme://$host$request_uri$cache_type"; # 加入类型标识防混用 proxy_cache_lock on; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
这样,当后端返回 Content-Type: application/json 时,Nginx 就会自动使用 5m 缓存有效期,并把该响应存入带 _json 后缀的 key 下,与其他类型完全隔离。
验证与调试技巧
- 用
curl -I查看响应头中的X-Cache和Age,确认是否命中缓存及剩余时间 - 临时添加
add_header X-Cache-TTL $cache_ttl;和X-Cache-Type $cache_type;辅助调试 - 注意:浏览器或客户端可能自行缓存,测试时建议加随机参数(如
?t=123)或禁用本地缓存(curl -H "Cache-Control: no-cache") - 若发现始终走
default分支,检查后端是否真正设置了Content-Type响应头 ——map匹配的是响应头,不是请求头(常见误区!)
实际上,$http_content_type 是请求头变量,但真实场景中我们更常根据**后端返回的响应头**做判断。若需按响应类型缓存,应改用 $upstream_http_content_type,并在 location 中配合 proxy_intercept_errors off 确保变量可用。











