Как добавить пользовательский заголовок, содержащий абсолютный адрес первоначально запрашиваемого ресурса

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с acl, который ссылается на be_id(backend-id)? Он не совсем динамический, но он может приблизить вас, если число бэкэндов невелико ... reqirepтакже поддерживает необязательный acl, поэтому вы можете написать отдельные регулярные выражения для каждого бэкэнда , каждый из которых активен, только если acl соответствует выбранному бэкэнду. Я бы.
Майкл - sqlbot

Ответы:

18

Краткий ответ: нет, вы не можете сделать это в HAProxy 1.4 .


Тем не менее, для тех, кто нашел этот вопрос на 1.5+:

В HAProxy 1.5+ вы можете ссылаться на переменные через %[variable]синтаксис, и вы не ограничены использованием только статических строк. Вы можете увидеть, какие переменные уже существуют в разделе 7.3 руководства по настройке HAProxy (в частности, 7.3.6 для переменных уровня 7 ).

В вашем случае вы смотрите на raw url, вот так:

http-request set-header X-Custom-Header %[url]
Ник Крейвер
источник
1
Спасибо за подтверждение моего вывода, что это невозможно в 1.4. Я перешел на nginx.
Дарин Димитров
% [url] не всегда является полным URL-адресом, но, по-видимому, это лучшее, что может сделать haproxy. Переменная URL haproxy 1.8 документы: cbonte.github.io/haproxy-dconv/1.8/configuration.html#7.3.6-url
zie