NGINX-Umleitungsregel transformiert Pfad in Abfragezeichenfolge

NGINX-Umleitungsregel transformiert Pfad in Abfragezeichenfolge

Wir haben eine vorhandene IIS-App, die mit Helicon APE ausgeführt wurde, um URLs unter Verwendung vorhandener Apache-Regeln neu zu schreiben. Dies ist ein Beispiel:

RewriteRule ^/webapp/([^/]*)/([^/]*)(/.+)? /webapp/$4?$2=$3 [NC,L,P,QSA]

Für diese Regeln /webapp/f6/3/gx/1/default.htmwird eine ursprüngliche URL wie in umgewandelt /default.htm?f6=3&gx=1. Dies unterstützt eine variable Anzahl von Zwischenpfaden in APE (anscheinend auch in Apache).

Da APE nicht gut skaliert und unter Belastung abstürzt, habe ich begonnen, ein NGINX einzurichten, das die Neuschreibungen durchführt und im Hintergrund den Lastenausgleich für die IIS-Server durchführt.

Ich habe jedoch ein Problem festgestellt: Die gleiche Regel funktioniert für Nginx-Umschreibungen nicht auf die gleiche Weise. Ich musste sie umwandeln, damit sie übereinstimmt:

rewrite ^/webapp/(.*)/([^/]+).htm /webapp/$2?$1;

was in der Tat für /webapp/f6/3/gx/1/default.htmRenditen sorgt /webapp/default.htm?f6/3/gx/1.

Ich habe versucht, eine Möglichkeit zu finden, wie nginx Pfadelemente /x/y/g/zin Abfragezeichenfolgenpaare umwandeln kann ?x=y&g=z. Apache scheint dies automatisch zu tun, während nginx dies nicht tut. Ich kann in der Dokumentation oder in anderen Fragen auf dieser Site oder bei StackOverflow nichts dazu finden.

Anscheinend könnte dies mithilfe von map möglich sein, aber ich kann keine spezifische Verwendung finden und bin kein Nginx-Experte, um dies zu bewerkstelligen. Jede Hilfe oder jeder Hinweis ist willkommen.

Antwort1

Wenn Sie die Umschreibregel richtig konstruieren, wird sie rekursiv und fragt bei jeder Iteration Parameter ab, bis alle Pfadelemente verbraucht sind.

Zum Beispiel:

rewrite ^(/webapp)/([^/]+)/([^/]+)(/.+)$ $1$4?$2=$3 redirect;

Da rewriteeine vorhandene Abfragezeichenfolge automatisch angehängt wird, erweitert die obige Anweisung diese bei jeder Weiterleitung.

Der gleiche Trick kann mit einer internen Weiterleitung erreicht werden, indem eine rewrite...lastAnweisung innerhalb eines locationBlocks platziert wird.

Sehendieses Dokumentfür mehr.

verwandte Informationen