Nginx反向代理需分层控制请求头:必须传递Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto;清除Connection等危险头;推荐补充X-Request-ID、X-Forwarded-By、X-Env;禁用全路径透传、无超时设置、stream代理HTTP及硬编码后端等高危配置。

要让 Nginx 在反向代理中输出标准化、可审计、符合企业级安全与可观测性要求的请求头,关键不是“加得越多越好”,而是按角色分层控制:保留真实客户端信息、明确代理链路、屏蔽敏感或冗余字段、适配后端协议需求。以下为一线运维团队验证过的通用规范,可直接落地。
必须传递的核心客户端标识头
后端服务依赖这些字段做日志溯源、限流、风控和调试,缺一不可:
-
Host:用
proxy_set_header Host $host;保持原始域名,避免后端因 Host 错误返回 404 或 HTTPS 混合内容警告 -
X-Real-IP:用
proxy_set_header X-Real-IP $remote_addr;传递最外层真实客户端 IP(注意:仅适用于直连场景;若前有 CDN 或 LB,应改用$http_x_forwarded_for首段并做可信 IP 白名单校验) -
X-Forwarded-For:用
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;追加当前 Nginx 的 IP,形成完整转发链(如1.2.3.4, 10.0.1.10),后端据此识别首跳 IP -
X-Forwarded-Proto:用
proxy_set_header X-Forwarded-Proto $scheme;明确告知后端是 http 还是 https,避免重定向死循环或混合协议问题
需显式清除或覆盖的危险/冗余头
默认转发可能带入安全隐患或干扰后端逻辑,必须干预:
- 禁用
Connection和Keep-Alive:添加proxy_set_header Connection '';,防止 HTTP/1.0 兼容逻辑污染 HTTP/1.1 管道化行为 - 重写
Upgrade和Connection头以支持 WebSocket:仅在需要时配置proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection "upgrade";,否则默认不透传 - 禁止透传
Proxy-开头的头(如Proxy-Authorization):Nginx 默认不转发,但需确认未被自定义配置意外开启 - 不转发
Transfer-Encoding:Nginx 自动处理 chunked 编码,该头由它生成,后端无需接收
建议补充的运维增强头
便于链路追踪、灰度识别与故障定界,非强制但强烈推荐:
-
X-Request-ID:用
map指令生成唯一 ID(如map $request_id $req_id { "" $request_id; }),再proxy_set_header X-Request-ID $req_id;,与日志、APM 系统对齐 -
X-Forwarded-By:添加
proxy_set_header X-Forwarded-By "nginx-$hostname";,标识本级代理节点,多层代理时可逐级追查 -
X-Env:根据部署环境注入(如
proxy_set_header X-Env $env_name;,配合env指令或变量注入),区分 dev/staging/prod 流量
禁止使用的高危配置模式
这些写法在审计中常被标记为“严重风险”,应立即整改:
- 全路径无过滤转发:
location / { proxy_pass http://backend/; }—— 未限定路径范围,恶意路径(如/../../etc/passwd)可能穿透或触发后端路径遍历 - 未设超时的长连接:
proxy_read_timeout缺失或设为 0 —— 导致后端 hang 死时 Nginx 连接长期占用,拖垮并发能力 - 使用
stream模块代理 HTTP 流量:stream { server { proxy_pass backend; } }—— 无法解析 HTTP 头,不能做 Host 匹配、Header 控制、TLS 终止,丧失所有应用层治理能力 - 硬编码后端地址且无健康检查:
proxy_pass http://192.168.1.10:8080;无upstream块 —— 单点故障,无法自动摘除异常节点











