我试图通过这种方式为子域添加标题:
acl ExampleRule hdr(host) -i subdomain.example.com
http-response set-header X-test "test" if ExampleRule
但是当我加载页面时,它没有被添加。有人知道如何添加吗?
答案 0 :(得分:1)
有两个问题。
首先是http-response
和hdr()
一起将导致测试响应标头,而不是请求标头。
hdr([<name>[,<occ>]]) : string
当用于请求时,它等效于
req.hdr()
;当用于请求时,等效于res.hdr()
用于响应。请参阅这些各自的获取信息以获取更多详细信息。 如果对获取方向有疑问,请使用显式指示。http://cbonte.github.io/haproxy-dconv/1.6/configuration.html#7.3.6-hdr
因此,您想使用req.hdr()
。
但这还不够,因为无论声明顺序如何,都将ACL条件评估推迟,并且仅在遇到引用ACL的语句时和动态地进行。
在响应处理期间评估ACL时,req.hdr()
将不匹配任何内容,因为出于效率考虑,将请求发送到服务器后立即释放请求缓冲区。在响应处理期间它不可用,因此没有任何请求提取可以从中返回任何值-它已被忘记。
因此,您需要在请求处理期间在事务变量中捕获标头...
http-request set-var(txn.myhostheader) req.hdr(host)
...然后在响应处理期间评估变量的值。
acl ExampleRule var(txn.myhostheader) -i subdomain.example.com
http-response set-header X-test "test" if ExampleRule
或者可以将后两行替换为这一行(匿名ACL):
http-response set-header X-test "test" if { var(txn.myhostheader) -i subdomain.example.com }
在每种情况下,变量名称为txn.myhostheader
为txn
(必填),表示在请求和响应期间保留其值的变量+ .
(必填)+ myhostheader
,这是我的名字。