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 }
Run Code Online (Sandbox Code Playgroud)
可以使用地图重写为:
frontend xyz
<other_lines>
use_backend %[req.hdr(host),lower,map_dom(/path/to/map,default)]
Run Code Online (Sandbox Code Playgroud)
以地图文件的内容为:
#domainname backendname
myapp.domain1.com backend1
myapp.domain2.com backend2
Run Code Online (Sandbox Code Playgroud)
但是,如果路由基于路径,如下例所示:
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
Run Code Online (Sandbox Code Playgroud)
是否可以为此用例进行映射?使用base而不是hdr(host)可能会给出整个路径,但它不具有域的灵活性,因为它base是字符串比较.还有其他方法可以将其转换为haproxy地图.
Mic*_*bot 10
从第7层base获取开始 -
这将返回第一个Host头和请求的路径部分的串联,它从第一个斜杠开始并在问号之前结束.
...然后用于map_beg()将字符串的开头与地图匹配.
use_backend %[base,map_beg(/etc/haproxy/testmap.map,default)]
Run Code Online (Sandbox Code Playgroud)
如果映射文件/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
Run Code Online (Sandbox Code Playgroud)
要将子域视为等效于父域(例如,将example.com和www.example.com视为等效处理,不进行映射复制,如注释中所述),regsub()转换器可用于修改传递给映射的值:
use_backend %[base,regsub(^www\.,,i),map_beg(/etc/haproxy/testmap.map,default)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6729 次 |
| 最近记录: |