正确做法是使用proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;逐层追加IP,而非add_header(仅用于响应头);需配合real_ip_module、set_real_ip_from和real_ip_recursive on校验可信代理,确保后端获取真实客户端IP。

在 Nginx 中,X-Forwarded-For 字段通常用于记录客户端真实 IP,但**不建议手动用 add_header 追加**,因为该字段是代理链式累积的,重复添加会导致格式错误或安全风险。正确做法是使用 proxy_set_header(在反向代理场景下)或 real_ip 模块配合可信来源处理。
使用 proxy_set_header 正确设置 X-Forwarded-For
当 Nginx 作为反向代理(如转发请求到后端应用服务器)时,应在 location 或 server 块中配置:
-
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 这是标准写法,会自动继承上游已有的X-Forwarded-For值,并追加当前客户端 IP(由$remote_addr提供) - 确保同时设置
proxy_set_header Host $host;和proxy_set_header X-Real-IP $remote_addr;,便于后端识别 - 示例片段:
location / {
proxy_pass http://backend;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
避免用 add_header 设置 X-Forwarded-For
add_header 是向响应头中添加字段,而 X-Forwarded-For 是**请求头**,只对上游服务有意义。用它设置请求头无效,且可能造成混淆:
-
add_header X-Forwarded-For ...实际添加的是响应头,后端收不到 - 若误用于请求头伪造,可能被中间设备覆盖或引发日志污染
- 该字段应由最外层可信代理生成,不可由内层 Nginx “补全”
确保真实客户端 IP 可靠传递
仅设置 X-Forwarded-For 不够,还需防止伪造。推荐组合使用:
- 启用
real_ip模块(Nginx 默认编译包含),在http或server块中指定可信代理 IP: - 这样
$remote_addr和$realip_remote_addr才能反映真实用户 IP,$proxy_add_x_forwarded_for也才可靠
set_real_ip_from 10.0.0.0/8; set_real_ip_from 172.16.0.0/12; set_real_ip_from 192.168.0.0/16; real_ip_header X-Forwarded-For; real_ip_recursive on;
调试与验证方法
确认是否生效,可临时在后端返回请求头,或用 curl 查看 Nginx 转发后的实际请求头:
- 在后端服务(如 Python Flask)中打印
request.headers.get('X-Forwarded-For') - 用
curl -H "X-Forwarded-For: 1.2.3.4" http://your-nginx/测试是否被正确追加(如变成1.2.3.4, 192.168.1.100) - 检查 Nginx 错误日志,确认无
invalid number of arguments in "set_real_ip_from"等配置错误











