nginx透传客户端真实ip与协议头需三步协同:①用proxy_set_header设置x-real-ip、x-forwarded-for、x-forwarded-proto等头;②通过set_real_ip_from和real_ip_header限定可信代理并解析真实ip;③后端主动读取对应header而非remote_addr。

在 Nginx 的 server 块中配置请求头,主要是通过 proxy_set_header 指令(用于反向代理场景)或 add_header(用于响应头),但注意:Nginx 本身不能直接修改客户端发来的请求头(即“入站请求头”),只能在转发请求给后端时设置或修改发送给后端的请求头。
如果你的目标是「让 Nginx 在代理请求时,向后端服务传递特定的请求头」,那就在 location 或 server 块里用 proxy_set_header;如果是想「给客户端返回的响应添加头」,则用 add_header。
配置转发给后端的请求头(常用)
这是最常见需求,比如透传真实 IP、添加认证信息、自定义标识等。需配合 proxy_pass 使用:
-
透传原始客户端 IP:
proxy_set_header X-Real-IP $remote_addr; -
透传完整请求头中的 Host:
proxy_set_header Host $host;(避免后端收到的是 upstream 地址) -
强制覆盖 Host 头:
proxy_set_header Host api.example.com; -
传递原始请求协议:
proxy_set_header X-Forwarded-Proto $scheme; -
禁用某请求头(如清除 Proxy-Authorization):
proxy_set_header Proxy-Authorization "";
⚠️ 注意:proxy_set_header 默认会继承 Nginx 的默认头(如 Host, Connection),但一旦你显式设置某个 header,它就会覆盖默认值。未设置的头不会自动透传。
清除或重置请求头
某些请求头(如 Proxy- 开头的)可能被客户端恶意构造,Nginx 可主动清空:
- 清空特定头:
proxy_set_header X-Some-Bad-Header ""; - 禁用所有自动添加的默认头(谨慎):
proxy_pass_request_headers off;(一般不推荐,会导致 Host 等关键头丢失)
给响应添加头(非请求头,但常混淆)
如果本意是「让 Nginx 返回给浏览器的响应带上自定义头」,用 add_header:
add_header X-Backend nginx-v1.24;add_header Cache-Control "no-cache, no-store";- 注意:
add_header不会出现在 301/302 重定向响应中(除非加always参数:add_header X-Foo bar always;)
验证和调试技巧
配置完记得测试是否生效:
- 用
curl -v http://your-domain/查看响应头(对add_header) - 在后端服务日志或代码中打印
X-Real-IP、Host等字段(验证proxy_set_header是否到达) - Nginx 日志中开启
$http_x_forwarded_for等变量,辅助排查
不复杂但容易忽略:所有 proxy_set_header 必须写在 proxy_pass 所在的 location 块内才生效;写在 server 块顶层但没被 location 继承,是无效的。











