如何添加包含原始请求资源的绝对地址的自定义标头


11

我有以下设置:

                 |-------|--- backend1:8080
example.com:80---|HAProxy|--- backend2:8080
                 |-------|--- backend3:8080

我想配置HAProxy以添加包含原始URL的自定义标头。例如,如果用户请求http://example.com/foo?bar=baz,即:

GET /foo?bar=baz HTTP/1.1
Host: example.com:80

我希望HAProxy将此请求转换为后端,如下所示:

GET /foo?bar=baz HTTP/1.1
Host: backend1:8080
x-custom-header: http://example.com/foo?bar=baz

reqadd选项仅允许我添加具有静态值的标头。我能够使用reqrep以下命令从请求中获取路径部分:

reqrep ^([^\ ]*)\ ([^\ ]*)\ (HTTP\/1\.[10])  \0\r\nx-custom-header:\ \2

但不幸的是,这仅捕获了原始url的路径部分,导致了以下标头:

x-custom-header: /foo?bar=baz

所以我的问题是,在HAProxy 1.4中是否可以将Host标头和HTTP请求的第一行都组合到自定义标头中


您是否尝试过结合reqadd引用be_id(backend-id)的ACL ?它不是完全动态的,但是如果后端数量很少,它可能会使您更接近…… reqirep还支持可选的acl,因此您可以为每个后端编写单独的正则表达式,仅当acl与选定的后端匹配时才激活每个正则表达式- ID。
Michael-sqlbot 2014年

Answers:


18

简短的答案:不,您不能在HAProxy 1.4中执行此操作。


但是,对于在1.5+上发现此问题的人:

在HAProxy 1.5+中,您可以通过%[variable]语法引用变量,而不仅限于使用静态字符串。您可以在HAProxy配置指南的7.3节中看到哪些变量已经存在(对于第7层变量,尤其是7.3.6)。

对于您的情况,您正在查看raw url,如下所示:

http-request set-header X-Custom-Header %[url]

1
感谢您确认我的结论:在1.4中这是不可能的。我已切换到nginx
Darin Dimitrov 2014年

%[url]并不总是完整的URL,但这似乎是haproxy可以做的最好的事情。haproxy 1.8 URL变量文档:cbonte.github.io/haproxy-dconv/1.8/configuration.html#7.3.6-url
zie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.