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

HAProxy path regexp based on map lookup

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

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

我尝试使用映射来查找基于 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/.*$

为了避免正则表达式的复杂性,我还尝试了 'beg' 替代方法:

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

...但运气不好。

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

这无法按照您尝试的方式完成,因为 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)/.*$ }

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

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