我在运行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)] }
...但是没有运气。
是否可以使用地图解决我的特定问题?如果没有,您可以提出替代解决方案吗?
答案 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)]