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 reqadd
Option 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 Host
Header als auch die erste Zeile der HTTP-Anforderung in einem benutzerdefinierten Header zu kombinieren
reqadd
mit einer ACL zu kombinieren , die auf diebe_id
(Backend-ID) verweist ? Es ist nicht gerade dynamisch, aber es kann Sie näher bringen, wenn die Anzahl der Backends gering ist ...reqirep
unterstü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.Antworten:
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
url
wie folgt aus:quelle
nginx
.