Eu tenho a seguinte configuração:
|-------|--- backend1:8080
example.com:80---|HAProxy|--- backend2:8080
|-------|--- backend3:8080
Eu gostaria de configurar o HAProxy para adicionar um cabeçalho personalizado contendo o URL original. Por exemplo, se o usuário solicitar http://example.com/foo?bar=baz
, ou seja:
GET /foo?bar=baz HTTP/1.1
Host: example.com:80
Gostaria que o HAProxy traduza essa solicitação para o back-end da seguinte forma:
GET /foo?bar=baz HTTP/1.1
Host: backend1:8080
x-custom-header: http://example.com/foo?bar=baz
A reqadd
opção permite apenas adicionar um cabeçalho com um valor estático. Consegui obter a parte do caminho da solicitação usando reqrep
:
reqrep ^([^\ ]*)\ ([^\ ]*)\ (HTTP\/1\.[10]) \0\r\nx-custom-header:\ \2
mas, infelizmente, isso captura apenas a parte do caminho do URL original, resultando no seguinte cabeçalho:
x-custom-header: /foo?bar=baz
Portanto, minha pergunta é se é possível no HAProxy 1.4 combinar o Host
cabeçalho e a primeira linha da solicitação HTTP em um cabeçalho personalizado
reqadd
com um acl que referencia obe_id
(backend-id)? Não é precisamente dinâmico, mas pode aproximá-lo se o número de backreqirep
-end for pequeno ... também suporta uma ACL opcional; portanto, você pode escrever regexes separadas para cada back-end, cada uma ativada apenas se uma ACL corresponder ao back-end selecionado. Eu iria.Respostas:
Resposta curta: não, você não pode fazer isso no HAProxy 1.4 .
No entanto, para aqueles que encontrarem essa pergunta no 1.5+:
No HAProxy 1.5+, você pode fazer referência a variáveis por meio da
%[variable]
sintaxe e não está restrito a usar apenas seqüências estáticas. Você pode ver quais variáveis já existem na seção 7.3 do guia de configuração HAProxy (especificamente 7.3.6 para variáveis da camada 7 ).Para o seu caso, você está olhando cru
url
, assim:fonte
nginx
.