Cómo agregar un encabezado personalizado que contenga la dirección absoluta del recurso solicitado originalmente

11

Tengo la siguiente configuración:

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

Me gustaría configurar HAProxy para agregar un encabezado personalizado que contenga la url original. Por ejemplo, si el usuario lo solicita http://example.com/foo?bar=baz, es decir:

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

Me gustaría que HAProxy traduzca esta solicitud al backend así:

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

La reqaddopción solo me permite agregar un encabezado con un valor estático. Pude obtener la porción de ruta de la solicitud usando reqrep:

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

pero desafortunadamente esto captura solo la parte de la ruta de la url original que resulta en el siguiente encabezado:

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

Entonces mi pregunta es si es posible en HAProxy 1.4 combinar tanto el Hostencabezado como la primera línea de la solicitud HTTP en un encabezado personalizado

Darin Dimitrov
fuente
¿Has intentado combinar reqaddcon una acl que hace referencia al be_id(backend-id)? No es precisamente dinámico, pero podría acercarlo si el número de backends es pequeño ... reqireptambién admite una acl opcional, por lo que posiblemente podría escribir expresiones regulares separadas para cada back-end, cada una activa solo si una acl coincide con el backend seleccionado. carné de identidad.
Michael - sqlbot

Respuestas:

18

Respuesta corta: no, no puedes hacer esto en HAProxy 1.4 .


Sin embargo, para aquellos que encuentren esta pregunta en 1.5+:

En HAProxy 1.5+ puede hacer referencia a variables a través de la %[variable]sintaxis y no está restringido a usar solo cadenas estáticas. Puede ver qué variables ya existen en la sección 7.3 de la guía de configuración de HAProxy (específicamente 7.3.6 para las variables de la capa 7 ).

Para su caso, está viendo raw url, así:

http-request set-header X-Custom-Header %[url]
Nick Craver
fuente
1
Gracias por confirmar mi conclusión de que esto no es posible en 1.4. Me he cambiado a nginx.
Darin Dimitrov
% [url] no siempre es la URL completa, pero parece ser el mejor haproxy que puede hacer. haproxy 1.8 URL variable docs: cbonte.github.io/haproxy-dconv/1.8/configuration.html#7.3.6-url
zie