Haproxy

後端條件中的複雜 AND/OR

  • August 5, 2021

我正在嘗試在以下情況下使用後端:

它是被請求的產品站點(即有 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 )

但是,我似乎無法弄清楚如何在不收到配置錯誤的情況下編寫這樣的條件。

haproxy 邏輯中沒有“和”,但如果你擴展括號並這樣寫,你應該很好:

use_backend prod-api-backend if prod url_opt-in or prod url_api

當您指定多個條件時,連詞(“and”)運算符是隱式的。當你這樣做的時候的意思:

acl foo ...
acl bar ...
use_backend ... if foo bar

use_backend如果兩者都匹配foobar執行。您可以指定||or介於兩者之間foobar使其成為析取。

如果您想要結合和析取的混合,最簡單的方法是採用不同的方法。

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

引用自:https://serverfault.com/questions/908523