HAProxy URL Rewrite ergibt 400 Bad Request und NOSRV

HAProxy URL Rewrite ergibt 400 Bad Request und NOSRV

Ich versuche, einen Teil einer URI mit reqrep neu zu schreiben.

haproxy.cfg (Original)

global
  log 127.0.0.1 local2
  daemon
  maxconn 256
defaults
  mode http
  log global
  option httplog
  timeout connect 5000ms
  timeout client 50000ms
  timeout server 50000ms

frontend haproxy_in
  bind *:8080

  default_backend myapp


backend myapp

  server app1 localhost:8123 check

Wenn ich das mache, sehe ich das erwartete Haproxy-Protokoll. Beachten Sie, dass ich einen Dummy-Python-Server verwende, der POST nicht verarbeiten kann. Daher ist die 501 kein Problem. Ich suche nur nach der Tatsache, dass die Anfrage weitergeleitet wurde.

haproxy_in myapp/app1 0/0/0/1/5 501 379 - - ---- 0/0/0/0/0 0/0 "POST /please/rewrite/this/ HTTP/1.1

Ich sehe in meinem Serverprotokoll auch Folgendes.

 "POST /please/rewrite/this/ HTTP/1.1" 501 -

haproxy.cdf (mit reqrep)

global
  log 127.0.0.1 local2
  daemon
  maxconn 256
defaults
  mode http
  log global
  option httplog
  timeout connect 5000ms
  timeout client 50000ms
  timeout server 50000ms

frontend haproxy_in
  bind *:8080

  default_backend myapp


backend myapp

  reqrep ^([^\ :]*\ /) "POST\ /test\ HTTP/1.1"

  server app1 localhost:8123 check

Mit dem hinzugefügten reqrep erhalte ich Fehlermeldungen von haproxy

haproxy_in myapp/<NOSRV> -1/-1/-1/-1/1 400 187 - - PR-- 0/0/0/0/3 0/0 "POST /please/rewrite/this/ HTTP/1.1"

Anscheinend ist meine Anfrage ungültig? Es sieht so aus, als ob die Anfrage es nicht aus Haproxy heraus schafft. Wie kann ich sehen, in was die Anfrage umgeschrieben wird? Ich habe mehrere verschiedene Reqrep-Befehle mit unterschiedlichen regulären Ausdrücken ausprobiert und alle scheinen mir denselben Fehler zu liefern.

Meine Haproxy-Version ist 1.5.16.

Antwort1

erforderlichbenötigt drei Parameter <search> <string> <cond>.

<search>: ist die URL, zum Beispiel www.somedomain.com/please/rewrite/this/

<string>: ist die Ersetzungszeichenfolge, zum Beispiel /test

<cond>: steht für etwaige Sonderbedingungen, ignorieren Sie es vorerst.

Im Beispiel bewirkt das Ersetzen Folgendes:

FROM: http://www.somedomain.com/please/rewrite/this/

TO: /test

Der Austausch erfolgt folgendermaßen:

reqrep http://www.somedomain.com/please/rewrite/this/ http://www.somedomain.com/test

Wenn Sie das Ignorieren der Domäne ersetzen möchten, müssen Sie sie mit einem regulären Ausdruck festlegen:

reqrep ^([^\ :]*)\/please/rewrite/this/ \1\/test

verwandte Informationen