Hinzufügen eines benutzerdefinierten Headers mit der absoluten Adresse der ursprünglich angeforderten Ressource

11

Ich habe folgendes Setup:

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

Ich möchte den HAProxy so konfigurieren, dass ein benutzerdefinierter Header hinzugefügt wird, der die ursprüngliche URL enthält. Zum Beispiel, wenn der Benutzer dies wünscht http://example.com/foo?bar=baz, dh:

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

Ich möchte, dass der HAProxy diese Anfrage wie folgt in das Backend übersetzt:

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

Mit dieser reqaddOption kann ich nur einen Header mit einem statischen Wert hinzufügen. Ich konnte den Pfadabschnitt aus der Anforderung abrufen, indem ich reqrep:

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

Leider erfasst dies nur den Pfadabschnitt der ursprünglichen URL, was zu folgendem Header führt:

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

Meine Frage ist also, ob es in HAProxy 1.4 möglich ist , sowohl den HostHeader als auch die erste Zeile der HTTP-Anforderung in einem benutzerdefinierten Header zu kombinieren

Darin Dimitrov
quelle
Haben Sie versucht, reqaddmit einer ACL zu kombinieren , die auf die be_id(Backend-ID) verweist ? Es ist nicht gerade dynamisch, aber es kann Sie näher bringen, wenn die Anzahl der Backends gering ist ... reqirepunterstützt auch eine optionale ACL, sodass Sie möglicherweise separate Regexes für jedes Back-End schreiben können, die jeweils nur aktiv sind, wenn eine ACL mit dem ausgewählten Backend übereinstimmt. Ich würde.
Michael - sqlbot

Antworten:

18

Kurze Antwort: Nein, dies ist in HAProxy 1.4 nicht möglich .


Für diejenigen, die diese Frage auf 1.5+ finden:

In HAProxy 1.5+ können Sie Variablen über die %[variable]Syntax referenzieren und müssen nicht nur statische Zeichenfolgen verwenden. Welche Variablen bereits vorhanden sind, erfahren Sie in Abschnitt 7.3 des HAProxy-Konfigurationshandbuchs (insbesondere 7.3.6 für Layer 7-Variablen ).

Für Ihren Fall sehen Sie roh urlwie folgt aus:

http-request set-header X-Custom-Header %[url]
Nick Craver
quelle
1
Vielen Dank für die Bestätigung meiner Schlussfolgerung, dass dies in 1.4 nicht möglich ist. Ich habe zu gewechselt nginx.
Darin Dimitrov
% [url] ist nicht immer die vollständige URL, aber es scheint das Beste zu sein, was Haproxy kann. haproxy 1.8 URL Variable docs: cbonte.github.io/haproxy-dconv/1.8/configuration.html#7.3.6-url
zie