内网与外网需用不同缓存键:通过可信请求头(如x-internal-request)或cidr匹配识别网络类型,嵌入proxy_cache_key并分设intranet/internet keys_zone,最后通过日志和curl实测验证key区分与缓存命中效果。

内网与外网访问使用不同缓存键,核心是让 Nginx 在 proxy_cache_key 中显式区分网络来源,并确保该区分维度稳定、可识别、不影响内容一致性。
用 $remote_addr 或 $http_x_forwarded_for 配合 IP 段判断
直接依赖客户端真实 IP 不可靠(可能被伪造),推荐结合可信的前置标识:
- 若流量必经公司统一网关或 CDN,且网关已注入
X-Forwarded-For或自定义头(如X-Internal-Request: true),优先用该 header 判断:map $http_x_internal_request $cache_zone {<br> "true" "intranet";<br> default "internet";<br>} - 若无可信 header,可基于
$remote_addr做 CIDR 匹配(仅限可信部署环境):map $remote_addr $network_type {<br> ~^10\.|~^172\.(1[6-9]|2[0-9]|3[0-1])\.|~^192\.168\. "intranet";<br> default "internet";<br>}
在 proxy_cache_key 中嵌入网络类型标识
将上一步提取的变量(如 $network_type)加入缓存键,且置于固定位置便于识别和清理:
- 基础写法:
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args $network_type"; - 增强可读性(推荐):
proxy_cache_key "net:$network_type:$scheme://$host$request_uri:$clean_args";
其中$clean_args已预处理剔除 UTM、随机参数等干扰项(参考知识库中 map 清洗逻辑) - 注意:不要用
$args原始值,避免因参数顺序/冗余导致同一资源生成多个 key
为不同网络类型配置独立 keys_zone
物理隔离缓存空间,防止内网高频请求挤占外网缓存容量,也便于单独监控与清理:
- 在
http块中定义两个 zone:proxy_cache_path /var/cache/nginx/intranet levels=1:2 keys_zone=intranet:128m max_size=2g;<br>proxy_cache_path /var/cache/nginx/internet levels=1:2 keys_zone=internet:512m max_size=10g;
- 在对应 location 中按条件选择 zone:
proxy_cache intranet;<br>proxy_cache_bypass $http_x_internal_request;<br>...
或用 if(慎用)+ set 配合更细粒度路由
验证是否真正生效
仅改配置不等于生效,必须实测确认:
- 加日志格式:
log_format cache_log '$remote_addr - $cache_key $upstream_cache_status';,并在 access_log 中启用 - 用 curl 分别从内网机器和公网机器发起相同请求,比对日志中的
$cache_key是否含intranet/internet且完全不同 - 检查
$upstream_cache_status:同一 URL 在内网连续请求应快速出现HIT,而外网请求不应命中内网 key











