需根据 Content-Type 动态设置 cache_valid,因不同资源更新频率差异大:CSS/JS等静态资源可缓存1小时,JSON等API响应仅缓存10秒;通过 map 指令匹配 $sent_http_content_type 实现差异化配置,并在 proxy_cache_valid 中引用 $cache_ttl 变量生效。
为什么需要根据 Content-Type 动态设置 cache_valid?
静态资源(如
text/css
、
application/javascript
)通常长期不变,适合缓存数天;而 API 响应(如
application/json
)可能秒级变动,缓存几秒更安全。Nginx 默认不支持按响应头动态配置
,但借助
指令,可基于
(即上游返回的 Content-Type)实现差异化缓存时效控制。
核心配置:用 map 提取 Content-Type 类型并映射缓存时间
在
块中定义映射关系,注意必须使用
(不是
,后者是客户端请求头):
说明:
表示忽略大小写的正则匹配
顺序重要:更具体的规则(如
)建议放在通用规则(如
)之前,避免被提前匹配
是兜底值,防止未匹配时变量为空导致语法错误
在 location 中启用
proxy
_cache 并引用 map 变量
在反向代理 location 块中,将
直接用于
:
Nginx
在宝塔面板中轻松管理Nginx高性能Web服务器。提供可视化配置反向代理、负载均衡、SSL证书及HTTP缓存功能,一键优化高并发性能,助您高效搭建稳定、快速的网站运行环境。
下载
关键点:
支持变量,但仅限于状态码后直接跟变量(如
),不能写成
单独一行
务必确认 upstream 返回了
头,可通过
验证
若上游压缩了响应(如 gzip),Nginx 默认会改写
为
,此时需在 map 中补充匹配或禁用自动重写(
+ 显式设置
)
验证与调试技巧
快速确认是否生效:
用
查看
和
头,对比不同资源的缓存命中周期
在 Nginx 日志中添加
到 log_format,实时观察映射结果
临时加
,浏览器开发者工具 Network 标签页直接查看响应头
注意:
在请求结束、响应头确定后才执行,所以它不影响缓存键(
),只影响过期策略
proxy_cache_validmap$sent_http_content_typehttp$sent_http_content_type$http_content_type
map $sent_http_content_type $cache_ttl {
default "5s";
~*^text/ "1h";
~*^application/javascript "1h";
~*^application/css "1h";
~*^image/ "24h";
~*^font/ "7d";
~*^application/json "10s";
~*^application/vnd.api+json "10s";
}
~*application/jsonapplication/default$cache_ttlproxy_cache_valid
proxy_cache my_cache;
proxy_cache_valid 200 302 $cache_ttl;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
必须开启 header 透传,否则 $sent_http_content_type 不可用
proxy_pass_request_headers on;
proxy_pass_request_body on;
确保上游响应头能被 map 捕获(默认已开启,但显式写出更稳妥)
proxy_buffering on;
proxy_cache_valid200 302 $cache_ttl200 $cache_ttlContent-Typecurl -IContent-Typeapplication/gzipgzip_vary offadd_header Vary Accept-Encoding;curl -I http://your-domain/path.jsX-CacheAge$sent_http_content_type $cache_ttladd_header X-Cache-TTL $cache_ttl;mapproxy_cache_key