推荐使用 nginx 的 geo 模块动态设置 cache-control:先在 http 块中用 geo 定义 ip 匹配变量(如 $cacheable_ip),再在 location 中通过 add_header cache-control 配合 always 参数按条件注入缓存头,支持差异化 ttl 设置,并需确保 real_ip_header 正确配置以获取真实客户端 ip。

可以通过 Nginx 的 map 指令结合 if 或更推荐的 location + geo 模块方式,对指定 IP 段动态设置 Cache-Control 响应头。关键在于:先识别来源 IP 是否属于目标网段,再据此控制缓存策略,避免影响其他客户端。
使用 geo 指令标记目标 IP 段
geo 是 Nginx 内置模块(默认启用),适合高效匹配 IP 范围。它不基于请求处理流程,性能优于 map 或 if,推荐优先使用:
- 在
http块中定义 IP 匹配变量,例如只对192.168.10.0/24和10.0.5.0/28开启缓存:
geo $cacheable_ip {
default 0;
192.168.10.0/24 1;
10.0.5.0/28 1;
}该配置将生成变量 $cacheable_ip,命中时为 "1",否则为 "0"。
在 location 中条件添加 Cache-Control 头
在具体 location 块(如静态资源路径)中,用 add_header 配合 always 参数确保响应头写入(尤其对 304/206 等非 200 响应也生效):
- 仅当
$cacheable_ip = "1"时添加缓存指令:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
expires 1h;
add_header Cache-Control "public, max-age=3600" always;
add_header X-Cache-Status "cached-for-internal" always;
# 其他配置...
}⚠️ 注意:expires 指令本身会自动设置 Cache-Control 和 Expires 头,若同时用 add_header 显式设置,需确认是否覆盖或冲突。更稳妥的做法是统一用 add_header 控制:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
add_header Cache-Control "public, max-age=3600" always;
add_header Expires $upstream_http_expires always;
# 或直接计算时间:add_header Expires "$time_local";
}进阶:按 IP 段差异化缓存策略
若需对不同网段设置不同缓存时长(如内网 1 小时、测试网段 5 分钟),可扩展 geo 变量值:
geo $cache_ttl {
default 0;
192.168.10.0/24 3600;
172.16.20.0/28 300;
}
<p>server {
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
add_header Cache-Control "public, max-age=$cache_ttl" always;
}
}</p>这样 Nginx 会把变量值直接注入响应头,实现灵活策略分发。
验证与调试建议
- 用
curl -I http://your-domain/file.js查看响应头是否含预期Cache-Control - 从目标 IP 段内外分别请求,比对
X-Cache-Status或Cache-Control差异 - 检查 Nginx 错误日志:
nginx -t确保配置语法正确;重启后观察error.log是否有geo相关警告 - 注意:如果站点使用了 CDN 或反向代理(如 Cloudflare),真实客户端 IP 可能被覆盖,需确保
real_ip_header和set_real_ip_from已正确配置,使geo基于原始 IP 判断











