Nginx: URL umleiten, um immer ein Gebietsschemapräfix einzuschließen

Nginx: URL umleiten, um immer ein Gebietsschemapräfix einzuschließen

Ich versuche, mit Nginx und Umleitungsregeln etwas zu erreichen, was ziemlich unkompliziert erscheinen sollte, aber ich bin auf ein Hindernis gestoßen.

Obwohl ich viele Fragen und Antworten durchgesehen habe, kann ich scheinbar keine Lösung finden, die für mich funktioniert.

Was ich erreichen möchte, ist Folgendes:

Wenn jemand über eine der folgenden URLs zu meiner Website navigiert:

http://mywebsite.com
http://mywebsite.com/
http://mywebsite.com/foo

Die Person wird weitergeleitet an:

http://mywebsite.com/en/
http://mywebsite.com/en/
http://mywebsite.com/en/foo/

Dies ist, was ich bisher in meiner Nginx-Konfigurationsdatei habe, und zwar in der Reihenfolge, in der sie in der Datei sind:

location ^/en/(.*) {
    try_files $uri /index.php$is_args$args last;
}

location / {
    if ( $uri !~ ^/(index\.php|css|jpg|png|images|core|uploads|js|robots\.txt|favicon\.ico) ) {
        return 301 /en/$uri;
    }
}

Mit der obigen Konfiguration gerate ich jedoch in eine Endlosschleife der Weiterleitung und die URL in der Adressleiste sieht am Ende so aus, bevor der Server aufgibt:

http://mywebsite.com/en//en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/

Kann jemand bitte:

a) Erklären Sie mir, warum meine Konfiguration nicht den gewünschten Effekt hatte, damit ich es verstehen kann und dieselben Fehler in Zukunft nicht wiederhole

b) Schlagen Sie eine Lösung vor, die funktioniert, und verbessern Sie, wenn möglich, meine Konfiguration

c) Gehen Sie, wenn möglich, noch einen Schritt weiter und erklären Sie anhand von Beispielen, wie ich nginx dazu bringen kann, das mit der Anfrage verknüpfte Gebietsschema automatisch zu bestimmen und die Anfrage dynamisch zu transformieren, um es in der oben beschriebenen Weise einzuschließen.

Danke

Antwort1

Erklären Sie mir, warum meine Konfiguration nicht den gewünschten Effekt hatte, damit ich es verstehe und dieselben Fehler in Zukunft nicht wiederhole

location ^/en/(.*)ist keine gültige Richtlinie.

Möglicherweise wurden Sie durch verwechselt location ^~ /en/(.*). Dies entspricht jeder Abfrage, die mit beginnt und /en/auf die ein beliebiger Wert folgt.

Tatsächlich entspricht die Anfrage immer der location /Direktive, sodass Sie in eine Endlosschleife geraten.

Schlagen Sie eine Lösung vor, die funktioniert, und verbessern Sie, wenn möglich, meine Konfiguration

Verwenden Sie einfach das Pfadpräfix innerhalb der locationDirektive:

location /en/ {
   try_files $uri $uri/ =404;
}

location / {
   return 301 /en$uri;
}

verwandte Informationen