后端条件中的复杂 AND/OR

后端条件中的复杂 AND/OR

我尝试在以下条件下使用后端:

这是所请求的产品站点(即 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可以在和之间指定||或,以使其成为析取。orfoobar

如果您想要混合使用合取和析取,最简单的方法是采用不同的方法。

如果在同一个 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

相关内容