haproxy:在语句条件中使用变量内联 acl

haproxy:在语句条件中使用变量内联 acl

让我们有以下后端配置:

HAProxy version 2.4.24-0ubuntu0.22.04.1 2023/10/31 - https://haproxy.org/

backend back-test
    http-request set-var(req.instance) hdr(X-Instance-Name)
    http-request set-var(req.instance) urlp(instanceName) unless { var(req.instance) -m found }

  # force-persist if { var(req.instance) -m str 1 2 }    #1
  # acl acl-force-persist var(req.instance) -m str 1 2   #2

    acl acl-force-persist urlp(instanceName)                -m str 1 2
    acl acl-force-persist hdr(X-Push-Service-Instance-Name) -m str 1 2
    force-persist if acl-force-persist

    use-server srv-production-1 if { var(req.instance) -m str 1 }
    use-server srv-production-2 if { var(req.instance) -m str 2 }    
  • 注释中的行没有按我预期的那样工作。
  • 未注释的行可正常工作。
  • use-server语句根据req.instance变量值正确运行,因此我希望内联 ACL 形式也是正确的,因为变量定义和变量值在运行时从 header 或 url 参数中提取。
  • http-request语句还可以使用带有变量检查谓词的内联 ACL 正确运行。
  • 不幸的是,当在语句中使用相同的 ACL 形式时force-persist ,它的行为就像总是FALSE提供一样(行 #1)。
  • 类似地,对于 ACL 定义本身,看起来变量没有值(行#2),因此必须以更详细/重复的方式定义 ACL(如下)。

注释行中的期望有何错误?

  1. 对于某些配置语句使用内联 ACL 是否不“合法”?
  2. 在 ACL 定义中使用请求变量是否“合法”?

相关内容