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 }
谢谢你的旅行。
我在前端使用以下 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 }
谢谢你的旅行。