首页 文章

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

提问于
浏览
6

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

目前它支持vhost的 Map :

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

可以使用 Map 重写为:

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

以 Map 文件的内容为:

#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 Map .

1 回答

  • 7

    Layer 7 base fetch开始 -

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

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

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

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

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

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

    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() 转换器可用于修改传递给子域的值 . Map :

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

相关问题