基于地图查找的HAProxy路径正则表达式

时间:2018-12-03 21:08:49

标签: haproxy

我在运行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的示例(未测试正则表达式):

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)] }

...但是没有运气。

是否可以使用地图解决我的特定问题?如果没有,您可以提出替代解决方案吗?

2 个答案:

答案 0 :(得分:1)

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

use_backend bk-%[base,lower,map_reg(/etc/haproxy/base_to_backend.map,bk_default)]

答案 1 :(得分:0)

这不能用您尝试的方式完成,因为引用log format variables的{​​{1}}不能在acl匹配上下文中使用。 %[] acl试图从字面上匹配path_beg

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

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

%[hdr(host),lower,map_dom(/etc/haproxy/domain_path_whitelist.map)]