Comment ajouter un en-tête personnalisé contenant l'adresse absolue de la ressource initialement demandée

11

J'ai la configuration suivante:

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

Je voudrais configurer le HAProxy pour ajouter un en-tête personnalisé contenant l'URL d'origine. Par exemple si l'utilisateur demande http://example.com/foo?bar=baz, c'est-à-dire:

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

J'aimerais que HAProxy traduise cette demande vers le backend comme ceci:

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

L' reqaddoption me permet uniquement d'ajouter un en-tête avec une valeur statique. J'ai pu obtenir la partie chemin de la demande en utilisant reqrep:

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

mais malheureusement, cela ne capture que la partie chemin de l'URL d'origine, ce qui entraîne l'en-tête suivant:

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

Ma question est donc de savoir s'il est possible dans HAProxy 1.4 de combiner à la fois l'en- Hosttête et la première ligne de la requête HTTP dans un en-tête personnalisé

Darin Dimitrov
la source
Avez-vous essayé de combiner reqaddavec un acl qui fait référence à be_id(backend-id)? Ce n'est pas précisément dynamique, mais cela pourrait vous rapprocher si le nombre de backends est petit ... reqirepprend également en charge un acl facultatif, vous pouvez donc éventuellement écrire des expressions rationnelles distinctes pour chaque backend, chaque actif uniquement si un acl correspond au backend sélectionné - id.
Michael - sqlbot

Réponses:

18

Réponse courte: non, vous ne pouvez pas faire cela dans HAProxy 1.4 .


Cependant, pour ceux qui trouvent cette question sur 1.5+:

Dans HAProxy 1.5+, vous pouvez référencer des variables via la %[variable]syntaxe et vous n'êtes pas limité à utiliser uniquement des chaînes statiques. Vous pouvez voir quelles variables existent déjà dans la section 7.3 du guide de configuration HAProxy (spécifiquement 7.3.6 pour les variables de la couche 7 ).

Pour votre cas, vous regardez brut url, comme ceci:

http-request set-header X-Custom-Header %[url]
Nick Craver
la source
1
Merci d'avoir confirmé ma conclusion que ce n'est pas possible dans 1.4. Je suis passé à nginx.
Darin Dimitrov
% [url] n'est pas toujours l'URL complète, mais il semble que le meilleur haproxy puisse le faire. docs de variable d'URL haproxy 1.8: cbonte.github.io/haproxy-dconv/1.8/configuration.html#7.3.6-url
zie