如何在HAProxy中使用映射文件批量阻止指定域名+路径的请求
如何在HAProxy中使用映射文件批量阻止指定域名+路径的请求
当然可以!HAProxy的映射(map)功能完美解决了你这种需要批量维护域名+路径黑名单的痛点,再也不用在配置里写一堆重复的ACL,管理起来省心太多了。下面一步步给你讲具体怎么做:
1. 创建黑名单映射文件
先准备一个纯文本文件,比如命名为blocked_domains_paths.map,每行按域名+路径 任意值的格式写(值随便填,比如1,我们只需要判断这个条目是否存在):
example.com/test-path 1 example2.com/another-path 1 # 可以加注释,空行会被自动忽略 example3.com/admin 1
如果需要匹配某个路径下的所有子路径(比如example.com/test-path/abc也想拦截),可以在路径末尾加*做前缀匹配:
example.com/test-path* 1
2. 修改HAProxy配置,加载映射并添加拦截规则
在你的HAProxy前端(frontend)配置块里,添加以下内容:
frontend your_frontend_name bind *:80 # 你的监听端口 # 把Host头转成小写(避免大小写不匹配),再和请求路径拼接成一个字符串,比如example.com/test-path http-request set-var(req.block_key) hdr(host),lower,concat(req.path) # 检查拼接后的字符串是否在黑名单映射文件里 # 如果是精确匹配用下面这行 acl is_blocked var(req.block_key) -f /full/path/to/blocked_domains_paths.map # 如果是前缀匹配(对应映射文件里带*的条目),用下面这行替代上面的ACL # acl is_blocked var(req.block_key) map_beg(/full/path/to/blocked_domains_paths.map) 1 # 匹配到就拒绝请求 http-request deny if is_blocked
3. 生效与维护
- 配置修改完后,重新加载HAProxy让配置生效:
systemctl reload haproxy(使用systemd的系统)或者kill -SIGUSR2 $(pidof haproxy) - 后续要更新黑名单的话,直接编辑
blocked_domains_paths.map文件,然后重新加载HAProxy即可,不需要重启服务
额外说明
- 用
hdr(host),lower转小写是为了避免大小写问题,比如Example.com和example.com都能被正确匹配 - 映射文件的路径一定要写绝对路径,避免HAProxy找不到文件
- 如果你的HAProxy版本低于2.0,
map_beg可能不支持,这种情况下可以用path_beg结合Host的ACL,不过还是建议升级到新版本获得更灵活的匹配能力
备注:内容来源于stack exchange,提问作者kzn
相关产品推荐
相关产品推荐

