Haproxy为子域添加响应头

时间:2018-07-17 07:22:27

标签: http-headers haproxy

我试图通过这种方式为子域添加标题:

acl ExampleRule hdr(host) -i subdomain.example.com
http-response set-header X-test "test" if ExampleRule

但是当我加载页面时,它没有被添加。有人知道如何添加吗?

1 个答案:

答案 0 :(得分:1)

有两个问题。

首先是http-responsehdr()一起将导致测试响应标头,而不是请求标头。

  

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.myhostheadertxn(必填),表示在请求和响应期间保留其值的变量+ .(必填)+ myhostheader,这是我的名字。