要让nginx对不同地理位置用户缓存不同语言版本页面,关键在于缓存键必须包含地理标识(如国家代码)和语言标识,并确保后端响应正确区分内容变体;需启用geoip2模块、构建含$geoip2_data_country_code和$lang的cache_key、配置proxy_cache_path与vary头,并使后端依据x-geo-country头适配内容。

要让 Nginx 对不同地理位置的用户缓存不同语言版本的页面,关键在于:**缓存键(cache key)必须包含地理标识(如国家代码)和语言标识(如 lang 参数或 Accept-Language 头),同时确保后端响应能正确区分内容变体**。单纯靠 GeoIP 识别还不够,必须把地域信息“注入”到缓存决策链中。
1. 启用并验证 GeoIP2 模块
Nginx 官方包默认不带 GeoIP2 支持,需确认已安装动态模块并加载:
- 检查是否启用:
nginx -V 2>&1 | grep -o http_geoip2—— 有输出才表示可用 - 数据库路径需可读,推荐放在
/etc/nginx/geoip/GeoLite2-Country.mmdb - 在
http块中配置解析逻辑(注意:不是旧版geoip_country):
$geoip2_data_country_code country iso_code;
$geoip2_data_country_name country names en;
}
2. 构建带地理维度的缓存键
默认 cache key 是 $scheme$request_method$host$request_uri,它不区分用户所在国。需显式加入 $geoip2_data_country_code 和语言信号:
- 定义自定义 cache key(放在
http块):
- 其中
$lang可通过map从Accept-Language或$geoip2_data_country_code推导(推荐后者保持一致性):
default en;
CN zh;
JP ja;
KR ko;
DE de;
FR fr;
}
3. 配置缓存区域与代理行为
在 server 或 location 中启用缓存,并确保响应头允许缓存变体:
- 定义缓存区(
http块):
- 在
location中启用缓存 + 设置 Vary 头(关键!):
proxy_cache geo_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_use_stale error timeout updating http_500;
add_header X-Cache-Status $upstream_cache_status;
add_header Vary "X-Geo-Country, Accept-Language";
proxy_set_header X-Geo-Country $geoip2_data_country_code;
proxy_pass http://backend;
}
注意:Vary 头告诉 CDN 或浏览器“这个响应是按国家和语言区分的”,避免混用缓存。
4. 后端配合与内容适配
缓存生效的前提是后端真正返回不同内容:
- 后端应读取请求头
X-Geo-Country或Cookie中的地区标识,渲染对应语言模板 - 静态资源(如 JS/CSS)若含语言文案,也应走相同 cache key 逻辑,或单独拆分路径(如
/zh/js/app.js) - 若用 i18n 框架(如 i18next),建议将
lng参数绑定到$lang,避免前端自行探测导致缓存失效











