如何在HAProxy中设置动态变量?

时间:2016-09-05 15:13:17

标签: linux haproxy

是否可以设置一个动态变量来保存HTTP标头的内容,例如主机/ X-Forwarded-Host将在以后的ACL中使用?

frontend web1
  # ...
  set-var s1(Host)
  acl site1 hdr_end(host) -i %[s1]
  # ...
  use_backend %[s1] if site1

1 个答案:

答案 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中工作)。