Nginx反向代理需显式配置透传客户端国家代码头。通过proxy_set_header指令转发X-Country-Code或CF-IPCountry,并可用map做格式校验,最后在后端验证头存在且值正确。

在 Nginx 作为反向代理时,若上游服务需要知道客户端的国家代码(如 Country-Code),而该信息来自真实客户端(比如通过 CDN、边缘节点或前端 JS 获取),Nginx 默认不会自动传递自定义请求头。你需要显式配置 Nginx 将它从原始请求中提取并转发给后端。
确保客户端或前置层已设置该头
国家代码通常不由浏览器原生提供,需由以下方式之一注入:
- CDN(如 Cloudflare)在请求中添加
CF-IPCountry头(值为两位大写 ISO 国家码,如US) - 前端 JS 通过 IP 定位 API 获取后,用
fetch手动添加请求头(注意:需服务端允许 CORS,且非简单请求会触发预检) - 客户端 SDK 或网关层统一注入
X-Country-Code等自定义头
在 Nginx 中透传或重命名该头
使用 proxy_set_header 指令将原始请求中的国家代码头转发给后端。例如:
location /api/ {
proxy_pass https://backend;
# 若客户端发来 X-Country-Code,则直接透传
proxy_set_header X-Country-Code $http_x_country_code;
<pre class="brush:php;toolbar:false;"># 或从 Cloudflare 的 CF-IPCountry 转换为标准头
proxy_set_header X-Country-Code $http_cf_ipcountry;
# 若想强制小写或做简单校验,可用 map 指令预处理(见下节)}
用 map 做轻量级标准化(可选)
如果希望统一格式(如转为小写、过滤非法值),可在 http 块中定义映射:
map $http_cf_ipcountry $country_code {
default "";
~^[A-Z]{2}$ $http_cf_ipcountry; # 只接受标准两位大写
}
<h1>然后在 location 中使用</h1><p>proxy_set_header X-Country-Code $country_code;这样能避免后端收到空值、乱码或超长字符串。
验证是否生效
在后端服务中打印所有请求头,确认 X-Country-Code(或你指定的头名)存在且值正确。也可用 curl 测试:
curl -H "X-Country-Code: CN" http://your-nginx/api/test
同时检查 Nginx 日志是否记录该头(需开启 log_format 包含 $http_x_country_code)。


















