Wir müssen ein etwas kompliziertes Problem in unserer Nginx-Konfiguration lösen. Derzeit haben wir eine Software in unserem Dokumentenstamm installiert. Diese Software verwendet einen einzigen Einstiegspunkt (index.php) und Abfragezeichenfolgen, um Inhalte anzuzeigen. Beispiel-URLs sind:
/index.php?forums/forum-name.1
/index.php?threads/thread-name.1
/index.php?users/user-name.1
Usw...
Jetzt verschieben wir diese Software in ein Unterverzeichnis /f/
und installieren eine neue Software im Dokumentenstamm. Diese Software verwendet AUCH index.php (allerdings keine Abfragezeichenfolgen). Wir müssen uns also eine Reihe von Umschreibregeln ausdenken, um NUR die URLs der alten Software umzuschreiben. Gleichzeitig werden wir auch index.php aus den URLs entfernen. Ein Satz Beispielzuordnungen ist:
/index.php?forums/forum-name.1 --> /f/forums/forum-name.1
/index.php?threads/thread-name.1 --> /f/threads/thread-name.1
/index.php?users/user-name.1 --> /f/users/user-name.1
Grundsätzlich muss ich also eine bestimmte Teilmenge der index.php-Anfragen umleiten (die nur ?Foren, ?Threads, ?Benutzer usw. enthalten), dann den index.php-Teil entfernen und an das Verzeichnis /f/ senden.
Ich habe den ganzen Morgen damit herumgespielt und schaffe es einfach nicht, dass es so funktioniert, wie ich es brauche.
Antwort1
Um komplexe Weiterleitungen zu verwalten, insbesondere wenn Abfragezeichenfolgen beteiligt sind, map
kann die Direktive verwendet werden.
Sie können die Abfragezeichenfolge (alles ab ?
) in location
und rewrite
Ausdrücken nicht zuordnen, da sie nicht Teil der normalisierten URI ist. Sie $request_uri
enthält jedoch die ursprüngliche Anforderung komplett mit Abfragezeichenfolge.
Das Abgleichen $request_uri
kann problematisch sein, wenn die Parameter nicht in einer konsistenten Reihenfolge gesendet werden. Außerdem werden URIs mit seltsamen Zeichen prozentual codiert.
Die map
Direktive kann auf Zeichenfolgen und/oder reguläre Ausdrücke zutreffen. Siehedieses Dokumentfür Details.
Zum Beispiel:
map $request_uri $redirect {
default 0;
~*^/index\.php\?(?<suffix>(forums|threads|users).*)$ /f/$suffix;
...
}
server {
...
if ($redirect) {
return 301 $redirect;
}
...
}
Verwenden Sie immerbenannte Aufnahmenin einem map
Block regulärer Ausdruck. Der zugeordnete Ausdruck wird bei der Anweisung ausgewertet return
. So wie ich es verstehe, trifft man jedes Mal auf nginx
eine Anweisung, die einenregulären Ausdruck(wie rewrite
, einige location
Blöcke und einige if
Anweisungen), werden die numerischen Erfassungen zurückgesetzt. Mitbenannte Aufnahmenstellt sicher, dass sie im Gültigkeitsbereich der return
Anweisung bleiben.
Sehendiese Vorsichtzur Verwendung von if
.