Nginx - Umleitung basierend auf Abfragezeichenfolgenparametern

Nginx - Umleitung basierend auf Abfragezeichenfolgenparametern

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, mapkann die Direktive verwendet werden.

Sie können die Abfragezeichenfolge (alles ab ?) in locationund rewriteAusdrücken nicht zuordnen, da sie nicht Teil der normalisierten URI ist. Sie $request_urienthält jedoch die ursprüngliche Anforderung komplett mit Abfragezeichenfolge.

Das Abgleichen $request_urikann problematisch sein, wenn die Parameter nicht in einer konsistenten Reihenfolge gesendet werden. Außerdem werden URIs mit seltsamen Zeichen prozentual codiert.

Die mapDirektive 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 mapBlock regulärer Ausdruck. Der zugeordnete Ausdruck wird bei der Anweisung ausgewertet return. So wie ich es verstehe, trifft man jedes Mal auf nginxeine Anweisung, die einenregulären Ausdruck(wie rewrite, einige locationBlöcke und einige ifAnweisungen), werden die numerischen Erfassungen zurückgesetzt. Mitbenannte Aufnahmenstellt sicher, dass sie im Gültigkeitsbereich der returnAnweisung bleiben.

Sehendiese Vorsichtzur Verwendung von if.

verwandte Informationen