HAproxy域名到基于路径(url)的路由的后端映射

时间:2016-06-16 11:49:30

标签: haproxy

HAProxy是否支持域名到后端映射以进行基于路径的路由。

目前它支持vhost地图:

frontend xyz
   <other_lines>
   use_backend backend1 if { hdr(Host) -i myapp.domain1.com }
   use_backend backend2 if { hdr(Host) -i myapp.domain2.com }

可以使用地图重写:

frontend xyz
   <other_lines>
   use_backend %[req.hdr(host),lower,map_dom(/path/to/map,default)]

将地图文件的内容作为:

#domainname  backendname
myapp.domain1.com backend1
myapp.domain2.com backend2

但如果路由基于路径,如下例所示:

frontend xyz
   acl host_server_myapp hdr(host) -i myapp.domain.com
   acl path_path1 path_beg /path1
   acl path_path2 path_beg /path2
   use_backend backend1 if host_server_myapp path_path1
   use_backend backend2 if host_server_myapp path_path2

是否可以为此用例进行映射?使用base代替hdr(host)可能会提供整个路径,但由于base是字符串比较,因此不具备域的灵活性。还有其他方法可以将其转换为haproxy地图。

1 个答案:

答案 0 :(得分:9)

Layer 7 base fetch -

开始
  

这将返回第一个Host头和路径部分的串联   请求,从第一个斜杠开始,在问题之前结束   标记

...然后使用map_beg()将字符串的开头与地图匹配。

use_backend %[base,map_beg(/etc/haproxy/testmap.map,default)]

如果地图文件/etc/haproxy/testmap.map的行与前缀匹配,则使用地图文件中的后端。否则,将使用名为default的后端(该map_beg()的第二个参数 - 如果地图不匹配则返回的值)。

如果生成的后端实际上不存在,HAProxy将继续处理请求,就好像此语句根本没有配置一样。

所以你的地图文件看起来像这样:

example.com/foo     this-backend # note, also matches /foo/ba 
example.com/foo/bar that-backend # note, matches /foo/bar
example.org/foo     some-other-backend

要将子域视为与父域等效(例如,将example.com和www.example.com视为等效处理,无需映射重复,如注释中所述),可以使用regsub()转换器修改传递给地图的值:

use_backend %[base,regsub(^www\.,,i),map_beg(/etc/haproxy/testmap.map,default)]