是否可以设置一个动态变量来保存HTTP标头的内容,例如主机/ X-Forwarded-Host将在以后的ACL中使用?
frontend web1
# ...
set-var s1(Host)
acl site1 hdr_end(host) -i %[s1]
# ...
use_backend %[s1] if site1
答案 0 :(得分:2)
这里有各种技巧。您根本不需要变量来根据主机地址设置ACL,并使用这些ACL选择后端。这将是一个简单的事情:
frontend web1
# ...
acl site1 hdr(host) -i example.com
acl site2 hdr(host) -i example.net
# ...
use_backend com if site1
use_backend net if site2
这就是你要做的所有事情,还是你想要完成一些更复杂的事情?
更新:以下是基于主机标头选择后端的方法:
frontend web1
# ..
http-request set-var(req.s1) req.hdr(Host),field(1,:),lower,regsub(\.,_,g)
use_backend %[var(req.s1)]
backend example_com
# ..
backend example_net
# ..
这将设置一个在请求上下文中有效的变量,使用较小的Host标头的值并将句点替换为下划线。实际上,你甚至不需要变量:
frontend web1
# ..
use_backend %[req.hdr(Host),field(1,:),lower,regsub(\.,_,g)]
如果找不到与主机头匹配的后端,则 HAproxy将返回503。如果您希望此类请求转到其他位置,您可以设置default_backend
(我测试了这个并且至少在1.6.3中工作)。