Nginx反向代理必须主动控制转发头而非默认透传:禁用客户端Host透传,改用$proxy_host或固定值;X-Real-IP用$remote_addr,X-Forwarded-For仅设首段真实IP;隐藏Server、X-Powered-By;关闭underscores_in_headers;default_server拦截非法Host。

关键不是“过滤哪些头”,而是“只发哪些可信的头”——Nginx 作为反向代理时,必须主动控制转发给后端的请求头,而非默认透传或拼接客户端输入。
禁用 Host 头透传,显式设置可信值
客户端 Host 头可被任意伪造,直接透传(如 proxy_set_header Host $host;)会导致后端误信恶意域名,引发重定向跳转、日志污染、租户路由错乱等风险。应改为:
-
推荐方式:使用
$proxy_host,即 proxy_pass 指令中配置的真实上游地址(如backend:8080),与业务域名解耦:proxy_set_header Host $proxy_host; -
单域名固定方式:若后端只服务一个域名,写死更安全:
proxy_set_header Host api.example.com; -
不建议:用
$http_host或$host,它们都来自不可信的客户端输入。
规范其他关键代理头,避免信息泄露或误用
除 Host 外,多个头部若未经处理就转发,也可能成为注入入口:
-
proxy_set_header X-Real-IP $remote_addr;—— 取真实客户端 IP,不依赖X-Forwarded-For(易伪造) -
proxy_set_header X-Forwarded-For $remote_addr;—— 若需传递原始链路,至少确保首段为真实 IP,不追加客户端提交的值 -
proxy_set_header X-Forwarded-Proto $scheme;—— 明确协议类型(http/https),防止后端因误判协议生成错误 URL -
proxy_hide_header Server;和proxy_hide_header X-Powered-By;—— 隐藏敏感响应头,减少攻击面
移除危险字段,防下划线解析绕过
某些框架会将含下划线的 HTTP 头(如 X_Attack)自动转为变量,而 Nginx 默认不解析下划线字段(underscores_in_headers off;)。为彻底规避风险:
- 在 http 或 server 块中添加:
underscores_in_headers off; - 配合
proxy_pass_request_headers off;(慎用)或用proxy_set_header显式覆盖,确保无未声明头透传 - 对已知高危自定义头(如
X-Forwarded-Host、X-Original-URL),用proxy_hide_header主动屏蔽
兜底:default_server 拦截非法 Host 请求
即使代理层做了防护,也需在入口堵住非法 Host 直连:
- 定义一个
default_server,监听 443/80,server_name _; - 不配置任何业务逻辑,直接返回
return 444;(关闭连接)或return 403; - 确保所有合法域名都在独立 server 块中显式声明,未匹配者一律拒之门外


















