基于地图查找的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)]
我在服务器上使用 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)]