我尝试在以下条件下使用后端:
这是所请求的产品站点(即 mysite.com 和 beta.mysite.com)
和
这是一个 API 请求
或者
这是一个选择加入请求
我针对每个条件设置了以下 acls:
acl prod hdr_beg(host) -i mysite.com
acl url_api path_beg /api/
acl url_opt-in path_beg /opt-in/
我现在想重定向到 prod-api-backend,如下所示:
use_backend prod-api-backend if prod AND ( url_api OR url_opt-in )
但是,我似乎无法弄清楚如何编写这样的条件而不会收到配置错误。
答案1
haproxy 逻辑中没有“和”,但是如果你展开括号并像这样写,那就很好了:
use_backend prod-api-backend if prod url_opt-in or prod url_api
答案2
当您指定多个条件时,连接(“and”)运算符是隐式的。这意味着当您执行以下操作时:
acl foo ...
acl bar ...
use_backend ... if foo bar
use_backend
如果和都匹配,则执行foo
。您bar
可以在和之间指定||
或,以使其成为析取。or
foo
bar
如果您想要混合使用合取和析取,最简单的方法是采用不同的方法。
如果在同一个 ACL 标识符下指定多个条件,则只要有任意一个条件匹配,ACL 就会被评估为真。例如:
acl url_matches path_beg /api/
acl url_matches path_beg /opt-in/
use_backend ... if url_matches
由于您使用的是相同的条件(部分url_matches
),因此您还可以在一行中指定多个比较目标。例如:
acl url_matches path_beg /api/ /opt-in/
use_backend ... if url_matches
因此,综合起来,选择上述两个解决方案中的后者,您可以执行以下操作:
acl prod hdr_beg(host) -i mysite.com
acl url_matches path_beg /api/ /opt-in/
use_backend prod-api-backend if prod url_matches