【问题标题】:haproxy nested conditions for aclacl 的 haproxy 嵌套条件
【发布时间】:2022-03-17 03:47:10
【问题描述】:

我需要嵌套的 ACL 条件

acl route1 hdr_sub(host) -i abc.com hdr_sub(host) -i xyz.com 
acl route2 path_beg /m1
acl route3 path_beg /m2


use backend back1 if route1 (route2 or route3)

// essentially  
route1 AND (route2 OR route3)

匹配后端。与此等效的正确 HA 代码是什么?

【问题讨论】:

    标签: haproxy


    【解决方案1】:

    单个 ACL 中的规则是 ORed,因此,您可以将 route2route3 规则与此组合:

    acl route2 path_beg /m1
    acl route2 path_beg /m2
    
    use backend back1 if route1 route2
    

    条件还支持|| 运算符,但不支持括号分组的优先级,所以a b || c 表示(a and b) or (c),这不等于你想要的......所以如果你不想组合如上所示的 ACL,您将需要这个...

    use backend back1 if route1 route2 || route1 route3
    

    ...这并不完全直观。

    或者这个:

    use backend back1 if route1 route2
    use backend back1 if route1 route3
    

    【讨论】:

    • 第一行有错字吗?那应该说route1 的名字吗?或者route2route3
    【解决方案2】:

    参见 HA 手册第 7.2 节。使用 ACL 形成条件

    您可以声明一个 ACL 来对这两个条件进行分组:

    acl route2_or_route3 path_beg /m1 /m2
    

    并在你的规则中使用它:

    use backend back1 if route1 route2_or_route3
    

    这意味着route1 和(route2route3)。

    ACL 中的条件按隐式逻辑OR 分组。

    操作规则中的条件按隐式逻辑AND 分组。

    【讨论】:

    • 请注意,HA 手册清楚地说明了事情,只使用了术语pathhosts。没有诸如“路由”之类的东西,它首先指定网络路由,并在 javascript 框架文档中被过度滥用,而不是 url 路径。建议谨慎使用名称泛化,因为这会使搜索变得更加困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2020-01-23
    • 2012-06-30
    相关资源
    最近更新 更多