Nginx不解析JSON但可通过路径、响应头等动态控制缓存,关键在于识别可缓存接口(如只读API、带版本号接口、用户无关数据),并用map指令配合add_header设置Cache-Control,注意覆盖后端头、敏感数据设private、验证响应头。

JSON数据通常由后端动态生成,Nginx本身不解析JSON内容,但可通过请求路径、响应头、变量等条件灵活控制其缓存行为。关键不是“针对JSON格式”做特殊处理,而是识别哪些JSON接口适合缓存、哪些必须禁用缓存,并通过Cache-Control精准传达给客户端和中间代理。
识别可缓存的JSON接口类型
并非所有JSON都该缓存。以下几类较适合启用缓存:
- 公开的只读API(如地区列表、配置字典、静态资源元信息)
- 带版本号或时间戳参数的接口(如
/api/v1/config?ts=20240501),内容稳定且更新可控 - 用户无关的数据(如首页轮播图配置、公告列表),不依赖Cookie或Authorization头
在Nginx中按需设置Cache-Control头
利用add_header配合if或map指令实现动态策略。推荐用map避免if性能隐患:
示例:对特定路径的JSON响应添加缓存指令
map $request_uri $json_cache_control {
~^/api/v1/dict/ "public, max-age=3600";
~^/api/v1/config/ "public, max-age=1800";
default "no-store, must-revalidate";
}
<p>server {
location ~ .json$ {
add_header Cache-Control $json_cache_control;</p><h1>其他代理或反向代理配置保持不变</h1><pre class="brush:php;toolbar:false;"> proxy_pass http://backend;
}}
注意响应头继承与覆盖问题
后端应用(如Spring Boot、Django)可能已输出Cache-Control,Nginx默认不会覆盖。需显式启用覆盖:
- 使用
add_header ... always;确保响应头始终生效(包括304、4xx等非200响应) - 若后端已设
Cache-Control: no-cache,而你想强制缓存,需先清除原头:proxy_hide_header Cache-Control;,再用add_header重写 - 对含敏感字段的JSON(如用户个人信息),务必确保
private或no-store,避免CDN或浏览器缓存泄露
验证与调试技巧
上线前务必实测响应头是否符合预期:
- 用
curl -I https://yoursite.com/api/v1/dict/countries检查Cache-Control值 - 在Chrome DevTools → Network → Header标签页中观察实际发出的响应头
- 模拟CDN或代理行为:加
-H "User-Agent: Mozilla/5.0 (compatible; CDN-Test/1.0)"排除客户端差异干扰 - 注意Vary头影响:若JSON响应依赖
Accept或Authorization,应配add_header Vary "Accept, Authorization";防止缓存错乱

















