haproxy 可通过 acl 规则与 http-request 指令在 http 七层实现基于 header 的路由、修改、透传及访问控制;支持 hdr() 提取匹配、set-header/add-header/del-header 操作、forwardfor 透传真实 ip,并可结合 header 实现 deny/redirect 等策略。

HAProxy 可以通过 HTTP Header 控制请求转发,核心在于利用 ACL 规则 + http-request 或 backend 配置,在七层(HTTP 模式)下提取、匹配、修改或传递 Header 信息,从而实现基于 Header 的路由、透传或策略分发。
识别并匹配特定 Header 值做路由决策
例如根据 X-Forwarded-For、Host、User-Agent 或自定义 Header(如 X-Tenant-ID)将请求分发到不同后端:
- 在
frontend或backend中定义 ACL,使用hdr()或hdr_sub()提取 Header 内容 - 示例:按租户 ID 路由
acl is_tenant_a hdr(X-Tenant-ID) -i tenant-ause_backend backend-a if is_tenant_a - 支持大小写忽略(
-i)、子串匹配(hdr_sub())、正则匹配(hdr_reg())等灵活方式
修改或添加 Header 后再转发
HAProxy 可在请求发出前注入、覆盖或删除 Header,常用于透传客户端真实信息或适配后端要求:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 用
http-request set-header添加或覆盖(如设置统一X-Request-ID) - 用
http-request add-header追加(不覆盖已存在同名 Header) - 用
http-request del-header删除敏感 Header(如Authorization某些场景下) - 注意:Header 名称区分大小写,但 HAProxy 默认按规范自动标准化为驼峰格式(如
x-forwarded-for→X-Forwarded-For)
透传原始客户端 IP 到后端
默认情况下后端看到的是 HAProxy 的 IP,需显式透传真实来源:
- 启用
option forwardfor(自动添加X-Forwarded-For) - 配合
http-request set-header X-Real-IP %[src]确保后端获取原始 IP - 若前端使用 PROXY 协议(如 Nginx 或 LVS),需配置
option http-server-close和http-request set-header X-Real-IP %[proxy_protocol_addr]
基于 Header 内容重定向或拦截
不只是转发,还能结合 Header 实现访问控制或跳转逻辑:
- 拒绝无认证 Header 的请求:
http-request deny if !{ hdr(X-API-Key) -m found } - 根据语言 Header 重定向:
http-request redirect location /zh/ if { hdr(Accept-Language) -i zh } - Header 为空时返回 400:
http-request deny if { hdr(User-Agent) -m len 0 }










