
Ich habe einen Container, den ich verwende, um einige kostenlose Weiterleitungen zu Diensten von Drittanbietern zu speichern. Es ist ein HAproxy-Container mit mehreren HTTP-Anforderungszeilen darin. Die meisten sind ein einzelner hdr(host), der umgeleitet werden soll.
Azure hat drei verschiedene URLs für die Kennwortverwaltung. Ich versuche, sie alle in einer URL mit unterschiedlichen Pfaden zur Weiterleitung auf die verschiedenen Seiten zusammenzufassen.
Das ist, was ich gerade habe:
http-request redirect location http://aka.ms/passwordchange code 301 if { path /change hdr(host) -i passwords.example.com }
http-request redirect location https://aka.ms/sspr code 301 if { path /reset hdr(host) -i passwords.example.com }
http-request redirect location https://aka.ms/setupsecurityinfo code 301 if { hdr(host) -i passwords.example.com }
Ich habe es auch zuerst mit der Bedingung hdr(host) versucht und auch mit einer „und“-Zeichenfolge zwischen den Bedingungen.
Aus irgendeinem Grund trifft es in all diesen verschiedenen Variationen immer nur auf die erste Regel zu. Alle Anfragen, egal ob ein Pfad angegeben ist, gehen also anhttp://aka.ms/passwordchange.
Ich vermute, dass die Bedingungen in einem einzeiligen Text wie diesem aus mehreren Teilen bestehen können, und zwar auf der Grundlage, dass, wenn dies nicht möglich war und nur das erste Element verwendet wurde, sie in der aktuellen Version nur der 3. Regel entsprechen sollten.
Vielen Dank für jede Hilfe und Erklärung, falls ich hier etwas übersehen habe.
Antwort1
Dies bedeutet nicht das, was Sie damit meinen:
{ path /change hdr(host) -i passwords.example.com }
String-Übereinstimmungen akzeptieren mehrere Werte, die durch ein Leerzeichen getrennt sind. Es handelt sich also tatsächlich um einen Vergleich der Anfrage path
miteine der Literalzeichenfolgen /change
oder hdr(host)
oder -i
oder passwords.example.com
, was überhaupt nicht das ist, was Sie beabsichtigt haben … aber das erklärt, warum HAProxy dies nicht als Syntaxfehler betrachtet, obwohl es im Prinzip einer ist.
Sie testen zwei unabhängige Dinge, daher benötigen Sie zwei anonyme ACLs:
{ path /change } { hdr(host) -i passwords.example.com }
Das „und“ zwischen den beiden ist implizit.
Ihre Konfiguration sollte folgendermaßen aussehen:
http-request redirect location http://aka.ms/passwordchange code 301 if { path /change } { hdr(host) -i passwords.example.com }
http-request redirect location https://aka.ms/sspr code 301 if { path /reset } { hdr(host) -i passwords.example.com }
http-request redirect location https://aka.ms/setupsecurityinfo code 301 if { hdr(host) -i passwords.example.com }