Nginx 作为反向代理时设置的请求头
这三个参数是 Nginx 作为反向代理时设置的请求头,目的是把真实的客户端信息传递给后端应用(Tomcat、Spring Boot、Node.js 等)。
location /api {proxy_pass http://172.28.3.106:8094;proxy_redirect http:// https://;proxy_set_header Host $host:$server_port;proxy_set_header X-real-ip $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
proxy_set_header Host $host:$server_port;
- 含义:把客户端请求时的 Host 头信息 传给后端。
$host
:请求的域名(可能来自Host
头,也可能是请求的 IP)。$server_port
:Nginx 接收请求时监听的端口号。- 作用:后端应用拿到的
Host
头和用户访问的保持一致,避免后端误判。
👉 例子:
用户访问
http://example.com:8080/api/user
Nginx 转发时会带上:
Host: example.com:8080
proxy_set_header X-Real-IP $remote_addr;
- 含义:告诉后端应用,真实客户端的 IP 地址。
$remote_addr
:Nginx 接收到请求时,客户端的源 IP。- 作用:让后端知道用户的真实 IP,而不是只看到 Nginx 的 IP。
👉 例子:
如果用户 IP 是 203.0.113.5
,那么后端会收到:
X-Real-IP: 203.0.113.5
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-
含义:传递请求经过的 代理链路中的客户端 IP 列表。
-
$proxy_add_x_forwarded_for
:会在已有的X-Forwarded-For
头后面追加$remote_addr
。 -
作用:
- 如果请求直接来自客户端 → 就是客户端 IP。
- 如果请求经过多个代理 → 会形成一个 IP 列表,最后一个就是最近的客户端。
👉 例子:
用户 203.0.113.5
→ 代理1(Nginx1) → 代理2(Nginx2) → 后端。
后端收到的头可能是:
X-Forwarded-For: 203.0.113.5, 10.0.0.1, 10.0.0.2
(第一个 IP 永远是真实用户的公网 IP)
总结
Header 配置 | 作用 | 典型用途 |
---|---|---|
Host $host:$server_port | 保留客户端访问的域名和端口 | 后端根据域名/端口做路由或多租户 |
X-Real-IP $remote_addr | 传递客户端真实 IP | 后端日志、风控、限流 |
X-Forwarded-For $proxy_add_x_forwarded_for | 传递完整代理链路上的客户端 IP 列表 | 追踪用户来源、防攻击分析 |
在实际项目里,Spring Boot 里要拿到 真实客户端 IP,通常要优先取:
X-Forwarded-For
的第一个 IP- 如果没有,就取
X-Real-IP
- 否则再 fallback 到
request.getRemoteAddr()