Haproxy 前端配置根据查询字符串替换响应 header

Haproxy frontend configuration to replace response header depending on query string

我在前端使用以下 haproxy 配置来根据查询字符串修改请求的响应 header:

frontend my-frontend
   acl is-foo urlp(foo) 1
   http-response replace-header Set-Cookie "(.*)" "; SameSite=None" if is-foo

根据我从文档中获得的信息,acl 应该匹配所有请求,例如

example.com?a=b&foo=1&bar=2
example.com?foo=1
example.com?a=b&foo=1

它不应该匹配

这样的请求
example.com?a=b&foo=0&bar=2
example.com?a=b
example.com?a=b&foo=bar

实际结果是acl从不匹配。 如果我反转 if 即:if !is-foo 每个请求都会发生 replace-header。 所以问题一定是acl永远不匹配。

我用的是haproxy 2.0.15

我自己搞定了。

在为 http-response 执行时,urlp(foo) 似乎在运行时不存在。

所以我们需要在之前使用set-var(custom.name)将它的值存储在一个临时变量中。在运行时,在 if 条件下,我们可以使用 var(custom.name) 访问它并将其与我们的条件进行匹配。我在这里使用 urlp_val() 而不是 urlp() 因为该值将立即转换为 int。

frontend my-frontend
    http-request set-var(txn.foo) urlp_val(foo)
    http-response replace-header Set-Cookie "(.*)" "; SameSite=None" if { var(txn.foo) eq 1 }

谢谢你的旅行。