it-swarm.com.de

URL ohne Sprachverzeichnis in die Standardsprache umleiten

Dies: example.com/test/ sollte umleiten zu: example.com/en/test/, aber: example.com/es/test/ sollte nicht umleiten.

in diesem Fall kann /test/ eine beliebige Anzahl von Ebenen haben (d. h .: /test/succeeded/ oder /).

Es ist ein Apache-Server mit .htaccess.

...
RewriteEngine on
RewriteRule . - [E=REWRITEBASE:/]
RewriteRule ^api$ api/ [L]

RewriteRule ^api/(.*)$ %{ENV:REWRITEBASE}webservice/dispatcher.php?url=$1 [QSA,L]

RewriteRule ^images_ie/?([^/]+)\.(jpe?g|png|gif)$ js/jquery/plugins/fancybox/images/$1.$2 [L]
.... 
#At the end of the file I have some redirects:
RedirectMatch 301 ^/es/manufacturer/(.*)$ /es/bodegas/$1
RedirectMatch 301 ^/en/manufacturer/(.*)$ /en/wineries/$1

Bearbeiten: Einige fragten, was ich versucht habe, und zum Zeitpunkt der Frage hatte ich nicht versucht, weil mein Regex-Wissen so schlecht ist. Aber dank einer Antwort habe ich einige Dinge ausprobiert:

RewriteRule !^(en|es)/(.*)$ /es/$1 [R=302,L] # From the response
RedirectMatch 302 !^/(en|es)/(.*)$ /es/$1 #Tried with a redirectmatch and adding starting / didn't work either
2
gpisw

Versuchen Sie Folgendes mit mod_rewrite am oberen Rand Ihrer .htaccess -Datei:

RewriteEngine On
RewriteRule !^(en|es)/ /en%{REQUEST_URI} [R=302,L]

Dies besagt, dass für jede angeforderte URL, die /en/ oder /es/ nicht startet, die Weiterleitung (302 - temporär) zu /en/<requested-url> erfolgt.

(Wechseln Sie nur dann zu einem 301, wenn dies erforderlich ist, nachdem Sie getestet haben, dass es einwandfrei funktioniert.)

PDATE:

Auch REQUEST_URI hat index.php an das Ende der URL angehängt.

Wenn Sie index.php in der URL sehen, sind die wahrscheinlichsten Ursachen dafür entweder:

  • Sie haben die Direktive an die falsche Stelle gesetzt, dh. zu spät in der Datei. Alle Weiterleitungen müssen sich am Anfang der Datei befinden, bevor vorhandene Umschreibungen vorgenommen werden. Die Reihenfolge ist wichtig.
  • Sie haben einen Konflikt mit einer anderen (möglicherweise mod_alias) Direktive.

    Seit Sie die Frage aktualisiert haben, werden Sie von mod_rewrite (RewriteRule) und mod_alias (RedirectMatch) umgeleitet/umgeschrieben. Verschiedene Module werden unabhängig voneinander und zu unterschiedlichen Zeiten während der Anforderung ausgeführt. mod_rewrite wird trotz der offensichtlichen Reihenfolge in der Datei immer zuerst ausgeführt. Dies kann zu (unerwarteten) Konflikten führen. Im Idealfall müssen Sie alle Ihre mod_alias-Weiterleitungen konvertieren, um stattdessen mod_rewrite RewriteRule zu verwenden (und sicherzustellen, dass sie dann in der richtigen Reihenfolge sind).

RewriteRule !^(en|es)/(.*)$ /es/$1 [R=302,L] # From the response

Dies würde niemals wie erwartet funktionieren, da Sie keine Gruppen in einem negierten regulären Ausdruck erfassen können. Sie werden einfach niemals mit irgendetwas übereinstimmen und der $1 -Rückverweis ist immer leer.

Nebenbei: Apache unterstützt auch keine Zeilenende-Kommentare (dh # From the response am Ende der Direktive in der gleichen Zeile). In diesem Fall scheint es aufgrund der Art und Weise, wie Apache die Anweisungen verarbeitet, in Ordnung zu sein (alles, was nach einer gültigen Anweisung erfolgt, wird einfach ignoriert). Wenn Sie jedoch das dritte Argument (dh die Flags [R=302,L]) entfernen, das immer noch gültig ist, erhalten Sie einen internen Serverfehler von 500. Dies liegt daran, dass Apache dann versucht, den "Kommentar" als das - Flags -Argument zu analysieren, das vollständig ungültig ist.

1
MrWhite