Como adicionar cabeçalho personalizado contendo o endereço absoluto do recurso solicitado originalmente


11

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 reqaddopçã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 Hostcabeçalho e a primeira linha da solicitação HTTP em um cabeçalho personalizado


Você já tentou combinar reqaddcom um acl que referencia o be_id(backend-id)? Não é precisamente dinâmico, mas pode aproximá-lo se o número de back reqirep-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.
Michael - sqlbot

Respostas:


18

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:

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

1
Obrigado por confirmar minha conclusão de que isso não é possível na versão 1.4. Eu mudei para nginx.
Darin Dimitrov

% [url] nem sempre é o URL completo, mas parece ser o melhor que o haproxy pode fazer. variável de URL haproxy 1.8 docs: cbonte.github.io/haproxy-dconv/1.8/configuration.html#7.3.6-url
zie
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.