haproxy acl规则通过“提取—判断—执行”三步闭环实现精细化流量控制:先用合适提取器(如hdr_dom、path_beg)精准抓取请求特征;再用-i、空格(and)、!(not)、||(or)构建逻辑;最后绑定use_backend、http-request deny等动作生效,并须经语法校验、日志验证和渐进上线。

HAProxy 的 ACL 规则是实现精细化流量控制的核心手段,不是简单“开或关”,而是通过提取请求特征、组合匹配逻辑、绑定执行动作,形成可复用、可叠加、可维护的策略链。关键在于理解“提取—判断—执行”三步闭环,而不是堆砌规则。
明确匹配目标:选对提取器(criterion)
ACL 效果好坏,第一步取决于是否从请求中准确“抓取”你要判断的信息。常用提取器按用途归类:
-
域名相关:优先用
hdr_dom(host)(域名层级匹配),比hdr(host)更鲁棒——它能正确识别www.example.com和example.com属于同一域,避免因 www 前缀缺失导致漏匹配。 -
路径分流:静态资源用
path_end -i .js .css .png .jpg;API 接口用path_beg /api/或path_reg ^/v[1-2]/auth/;管理后台可用path -m reg ^/admin(/|$)精确限定路径边界。 -
客户端特征:用
hdr_sub(User-Agent) mobile匹配移动端,hdr(X-Forwarded-For, 1)提取第一个真实 IP(防伪造),src直接匹配源地址或网段(如src 10.0.0.0/8 172.16.0.0/12)。 -
请求内容:
method GET限制只读操作,hdr(Cookie) -m reg \buser_id=[0-9]+\b提取特定 Cookie 字段做灰度判断。
写好判断逻辑:善用标志与组合
单条 ACL 往往不够,需靠修饰符和布尔运算构建真实业务逻辑:
使用 OpenAI Codex CLI 处理编码任务。触发词:codex、code review、fix CI、refactor code、implement feature、coding agent、gpt-5-codex。Clawdbot 可将编码工作委托给 Codex CLI 作为子代理或直接工具。
-
忽略大小写:所有字符串匹配加
-i,例如hdr_dom(host) -i example.com,避免因大小写不一致失效。 -
多条件并存:用空格表示 AND,如
acl is_api_admin hdr_dom(host) -i admin.example.com path_beg /api/,必须同时满足域名和路径才为真。 -
非与或逻辑:用
!表示否定(http-request deny if !internal_network),用||表示 OR(acl is_static path_end -i .html || path_end -i .txt)。 - 顺序敏感:ACL 自上而下匹配,第一条命中即停止。把高优先级、高命中率的规则(如内部 IP 白名单)放在前面,避免被后续规则拦截。
绑定执行动作:让规则真正生效
ACL 本身只是“开关”,必须配合动作指令才能控制流量:
-
路由分发:用
use_backend bk_api if is_api将匹配请求导向指定后端;default_backend bk_default作为兜底。 -
访问拦截:用
http-request deny if is_bad_bot直接拒绝;或http-request deny deny_status 403 if !allowed_country返回定制状态码。 -
重定向:用
http-request redirect location https://www.example.com%[capture.req.uri] code 301 if !hdr_beg(host) www.强制 www 跳转。 -
动静分离:静态资源可直接
use_backend bk_static,动态请求走应用集群,再配合cache段提升性能。
验证与上线:别跳过检查环节
配置写完不等于生效,漏掉验证极易引发线上故障:
-
语法校验:修改配置后,先运行
haproxy -c -f /etc/haproxy/haproxy.cfg,确认无报错再重启。 -
日志辅助:开启
option httplog,在日志中添加%{+Q}r查看原始请求头,用capture request header Host len 32抓取 Host 字段,方便排查匹配失败原因。 -
渐进上线:新 ACL 可先加
http-request set-var(txn.debug) str(1)打标记,配合日志观察命中情况,确认无误后再启用 deny 或 redirect。 -
文件化 IP 列表:黑白名单 IP 不要硬编码在配置里,改用
src -f /etc/haproxy/ip-blacklist.lst,支持热更新(reload 即可生效,无需 restart)。










