基于映射查找的HAProxy路径regexp

基于映射查找的HAProxy路径regexp,haproxy,Haproxy,我正在运行Debian stretch的服务器上使用HAProxy 1.8.14 我希望将请求路由到特定域集的不同后端,但仅限于某些特定路径。由于有相当多的域和不同的路径允许,我认为使用地图的解决方案会很好 我尝试使用映射来查找基于hdr(主机)的后端,条件是路径应该与映射到hdr(主机)的正则表达式匹配。我尝试了以下方法,但无法使其工作: use_backend bk-%[hdr(host),lower,map_dom(/etc/haproxy/host_to_backend.map,bk_d

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

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

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

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
域\路径\白名单.map示例(未测试regexp):

为了避免regexp的复杂性,我还尝试了一种“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)] }
……但运气不好


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

这不能按您尝试的方式完成,因为在acl匹配上下文中不能使用
日志格式变量
引用的
%[]
path\u beg
acl正试图真正匹配
%[hdr(主机)、lower、map\u dom(/etc/haproxy/domain\u path\u whitelist.map)]

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

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

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

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

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

另一种解决方案是haproxy ACL,我可以举一些例子来说明如何做到这一点。另外,我很好奇是否可以用mapsYup实现,但我真的不想使用acl。地图文件更易于维护,特别是在有数百个域的情况下。您使用地图所做的事情看起来是合理的(不确定重复的
bk
在后端名称中是否是故意的)。那它怎么办?重复的
bk
只是一个打字错误。我就是找不到与从地图上查到的regexp匹配的路径。查找后端名称的第一部分工作正常,但我无法使条件变为真。(我现在已修复了输入错误)您知道其他方法可以将路径与从映射文件加载的regexp进行比较吗?我正在阅读文档中的以下内容,不禁怀疑这可能是解决方案的一部分:>>The“-m”标志允许ACL使用映射文件。如果设置了此标志,则该文件将解析为两列文件。第一列包含ACL使用的模式,第二列包含示例。该示例可供以后的地图使用。这在少数情况下非常有用,在应用映射之前,ACL仅用于检查映射中是否存在模式。嗯,是的,我错过了,它看起来确实可以工作?我唯一关心的是,如果它希望所有内容都与“f”匹配,那么“-f”标志后面会跟一个文件名,从该文件中所有行都将被读取为单独的值“我现在正在玩它,你知道如何使用它了吗?-M标志看起来像是与-fYeah组合在一起的,我读到它时,您使用-f,然后使用-M将该文件用作映射文件,但我不知道如何应用“第一列包含ACL使用的模式,第二列包含示例。该示例可以稍后由映射使用。”因此,不,我还没有弄明白:(
use_backend bk-%[base,lower,map_reg(/etc/haproxy/base_to_backend.map,bk_default)]