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 reqadd
opció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 Host
encabezado como la primera línea de la solicitud HTTP en un encabezado personalizado
reqadd
con una acl que hace referencia albe_id
(backend-id)? No es precisamente dinámico, pero podría acercarlo si el número de backends es pequeño ...reqirep
tambié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.Respuestas:
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í:fuente
nginx
.