Ja, Chris hat es nun etwas anders umgesetzt, ist aber genau das gleiche was ich zuvor sagte.
Dass die hier nicht geht kann wieder ein einfacher Zeichenfehler sein
Code: Alles auswählen
RewriteCond %{REQUEST_URI} ^/catalog/de/$ [NC]
RewriteRule ^/catalog/de/$ / [R=301,L]
In der Rule hat vorne vor "catalog" das / nichts zu suchen, wenn es in einer .htaccess benutzt wird. Also einfach beginnen mit ^catalog. Das Zeichen für den Ordner wird da nicht mit übergeben, kann also auch nicht gefunden werden. Somit trifft die Rule nie zu und hat daher auch keinen Nutzen. Hatte das bei mir auch drinnen, war ein Fehler beim Kopieren, daher auch der Zusatz "ungetestet"
Deine möglichen URls heißen also:
/
/catalog/de/
/catalog/de/index.php (Sonderfall)
/catalog/de/index.php?id=923923
Aktuell war die Startseite "/catalog/de/", das Root wurde da hin geleitet.
Wie gesagt...
1. Vorhande Weiterleitung entfernen
2. Bei Zugriff auf Root, die index "/catalog/de/index.php" abrufen
Bei Zugriff auf "Beginnt und Endet mit nichts" (Root), die "/catalog/de/index.php" intern aufrufen.
3. Die alte Startseite "/catalog/de/" weiterleiten an "/"
Bei Zugriff auf "/catalog/de/" weiterleiten an "/". Dort greift dann wieder die erste Rule und ruft intern die "/catalog/de/index.php" auf
Da das ganze bisher nur greift, wenn es exakt "/catalog/de/" ist, sind die ganzen Parameter (Unterseiten) normalerweise nicht betroffen, denn bei denen kommt ja noch index.php danach vor.
Soll nun auch die "/catalog/de/index.php" weitergeleitet werden an "/", also so wie die "/catalog/de/" auch ist es ein Sonderfall, da die Index.php ja auch benutzt wird um die ganzen Parameter zu übergeben. Daher dort dann nur umleiten, wenn kein Parameter vorhanden ist. Zudem Ruft der Apache die index.php ja ohnehin von selbst auf, wenn auf ein Verzeichnis zugegriffen wird, daher muss man das unterscheiden. Wäre dem nicht so, dann würde auch der interne Zugriff weitergeleitet werden, also eine Endlosschleife entstehen.
Code: Alles auswählen
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /catalog/de/index\.php
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^catalog/de/index.php$ / [R=301,L]
Wenn es also nicht schon interner Request ist, gleichzeitig der Query-String leer ist und gleichzeitig auf die "catalog/de/index.php" zugegriffen wird, dann weiterleiten an "/". Die Ruft dann wieder intern die eigentliche "catalog/de/index.php" auf. Daher im Code die Prüfung auf den Subrequest.
Testseite:
Aufruf:
https://1nt.de
Abruf intern: /catalog/de/index.php
URL:
https://1nt.de
Status: 200
Aufruf:
https://1nt.de/catalog/de/
Weiterleitung: /
Abruf intern: /catalog/de/index.php
URL:
https://1nt.de
Status: 301
Aufruf:
https://1nt.de/catalog/de/index.php?id=123
Abruf intern: /catalog/de/index.php / Parameterübergabe
URL:
https://1nt.de/catalog/de/index.php?id=123
Status: 200
Aufruf:
https://1nt.de/catalog/de/index.php
Weiterleitung: /
Abruf intern: /catalog/de/index.php
URL:
https://1nt.de
Status: 301
Also bei mir funktioniert das so. Kannst Du ja selbst testen.
Meine .htaccess dazu sieht komplett zu aus:
Code: Alles auswählen
RewriteEngine ON
# Startseite intern umbiegen
RewriteRule ^$ /catalog/de/index.php [L]
# Alte Startseite weiterleiten
RewriteRule ^catalog/de/$ / [R=301,L]
# Alte Startseite index.php weiterleiten
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /catalog/de/index\.php
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^catalog/de/index.php$ / [R=301,L]