У меня есть следующие настройки:
|-------|--- 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 соответствует выбранному бэкэнду. Я бы.Ответы:
Краткий ответ: нет, вы не можете сделать это в HAProxy 1.4 .
Тем не менее, для тех, кто нашел этот вопрос на 1.5+:
В HAProxy 1.5+ вы можете ссылаться на переменные через
%[variable]
синтаксис, и вы не ограничены использованием только статических строк. Вы можете увидеть, какие переменные уже существуют в разделе 7.3 руководства по настройке HAProxy (в частности, 7.3.6 для переменных уровня 7 ).В вашем случае вы смотрите на raw
url
, вот так:источник
nginx
.