HAProxy路径regexp基于地图查找

问题描述 投票:0回答:2

我在运行Debian stretch的服务器上使用HAProxy 1.8.14。

我想将请求路由到某组域的不同后端,但仅针对某些特定路径。由于存在相当多的域和不同的路径,我认为使用地图的解决方案会很好。

我试图使用映射来查找基于hdr(host)的后端,条件是路径应该与映射到hdr(host)的正则表达式匹配。我尝试了以下但我无法让它工作:

use_backend bk-%[hdr(host),lower,map_dom(/etc/haproxy/host_to_backend.map,bk_default)] if { path_reg %[hdr(host),lower,map_dom(/etc/haproxy/domain_path_whitelist.map)] }

host_to_backend.map的示例:

a.foo.org a
b.foo.org b
c.foo.org c

domain_path_whitelist.map的示例(未测试的regexps):

a.foo.org ^/(yada|info)/.*$
b.foo.org ^.*$
c.foo.org ^/bar/.*$

为了避免正则表达式的复杂性,我也试过了“乞求”的替代方案:

use_backend bk-%[hdr(host),lower,map_dom(/etc/haproxy/host_to_backend.map,bk_default)] if { path_beg %[hdr(host),lower,map_dom(/etc/haproxy/domain_path_whitelist.map)] }

......但没有运气。

是否可以使用地图解决我的具体问题?如果没有,你能建议一个替代解决方案吗?

haproxy
2个回答
0
投票

这不能按照您尝试的方式完成,因为引用log format variables%[]不能在acl匹配上下文中使用。 path_beg acl试图与%[hdr(host),lower,map_dom(/etc/haproxy/domain_path_whitelist.map)]完全匹配。

另请注意,要匹配路径上的正则表达式,您需要使用path_reg

另一种解决方案是使用acl而不尝试映射变量,例如:

use_backend bk-%[hdr(host),lower,map_dom(/etc/haproxy/host_to_backend.map,bk_default)] if { path_req ^/(yada|info)/.*$ }

0
投票

我找到了HAProxy社区和asked there too。我可能会使用map_reg变体:

use_backend bk-%[base,lower,map_reg(/etc/haproxy/base_to_backend.map,bk_default)]
© www.soinside.com 2019 - 2024. All rights reserved.