要让 Nginx 对不同 MIME 类型执行差异化缓存策略,需用 map 指令提取 $upstream_http_content_type 并映射为 $cache_ttl,再在 proxy_cache_valid 中指定状态码引用该变量;同时配合 proxy_cache_bypass、proxy_ignore_headers 等指令控制缓存绕过与响应头处理,并通过 curl 实测响应头验证生效。

要让 Nginx 对不同 MIME 类型执行差异化的缓存策略,不能靠统一设置 proxy_cache_valid,而需结合响应头动态判断——核心是用 map 指令提取 $upstream_http_content_type,再映射为可复用的缓存时长变量。
基于 MIME 类型定义缓存时长
在 http 块中添加 map 规则,将上游返回的 Content-Type 归类并赋值为对应 TTL:
-
~*^text/html匹配 HTML,设为"5m"(短缓存,配合 ETag 更稳妥) -
~*^application/json匹配 API 响应,设为"30s"或"0s"(极短或禁用) -
~*^application/javascript和~*^text/css设为"1h"或更长 -
~*^image/和~*^font/可设为"7d"或"1y" - 兜底用
default "10m",避免未匹配时变量为空导致缓存失效
在 location 中启用类型感知缓存
确保代理配置中引用该变量,并明确指定状态码:
- 写法必须是
proxy_cache_valid 200 302 $cache_ttl;(不能省略状态码) - 若想彻底不缓存 JSON,可在同一 location 中加
proxy_no_cache $is_json;,其中$is_json是另一个 map 输出的布尔变量(值为 1/0) - 注意:该逻辑只对反向代理生效;静态文件直出场景需改用
expires或add_header Cache-Control
控制缓存绕过与强制回源
仅设 TTL 不够,还需决定“什么请求不该走缓存”:
- 对带认证信息的请求跳过缓存:
proxy_cache_bypass $http_authorization $cookie_admin; - 调试时可通过参数绕过:
proxy_cache_bypass $arg_nocache; - 禁止缓存含 Set-Cookie 的响应:
proxy_ignore_headers Set-Cookie;(防止用户态数据污染共享缓存)
验证是否生效
配置重载后,不能只看 Nginx 是否启动成功,要实测响应头:
- 用
curl -I https://example.com/api/data检查Content-Type是否为application/json - 再确认响应中是否有
X-Proxy-Cache: HIT或MISS,以及Cache-Control是否符合预期 - 对图片、字体等资源单独测试,避免因 MIME 映射缺失导致类型识别失败


















