RewriteRule Arbeitet nicht wie erwartet

Steffen Giers

Erfahrenes Mitglied
Hallo,

ich habe mal eine Frage zur folgenden Rewrite Rule:

Code:
# index.html oder index.php entfernen
RewriteCond %{THE_REQUEST} ^GET\ /.*/index\.(html|php)\ HTTP/
RewriteRule (.*)index\.(html|php)$ /$1 [R=301]

Die soll eigentlich nichts weiter machen als index.html bzw. index.php aus der URL zu entfernen. Das tut Sie auch ... aber nicht im Document Root. Und ich verstehe einfach nicht warum Sie dort nicht greift.

Bsp.:
Aus http://domain.de/verzeichniss/index.html
wird http://domain.de/verzeichniss/

Aus http://domain.de/verzeichniss/index.php
wird http://domain.de/verzeichniss/

Allerdings greift Sie nicht hier: http://domain.de/index.html. Das heißt das index.html bleibt stehen. Wenn ich http://domain.de/index.php aufrufe bekomme ich den Status 300 (Multiple Choices) vom Apache zurück. Aber auch nur im Root. In allen anderen Verzeichnissen und Unterverzeichnissen Arbeit die Regel wie erwartet.
 
Code:
RewriteCond %{THE_REQUEST} ^GET\ /(.+/)?index\.(html|php)\ HTTP/
RewriteRule index\.(html|php)$ /%1 [R=301]
 
Es geht... ich verstehe nur nicht warum :confused:. Würde es Dir etwas ausmachen mir kurz zu erläutern warum das so und nicht anders Funktioniert?

Also... die Klammern Gruppieren. Der . steht für ein beliebiges Zeichen. Das + steht für 1 oder mehr Zeichen.

Das heißt das vor dem /index irgendwas aber nicht nichts stehen darf. Und das ? nach der Gruppe sagt die Gruppe muss nicht oder einmal vorkommen um zu matchen. Ja?!

In der alter Regel stand das irgendwas (.) nicht oder mehrmals vor dem /index vorkommen kann um zu matchen.

Hm... trotzdem Herzlichen Dank für deine Hilfe!
 
Der entscheidende Unterschied ist das „/(.+/)?“ gegenüber dem „/.*/“. Bei Letzterem sind nämlich zwei Schrägstriche erforderlich.
 
Ah ok... ich denke nun hab ich zumindest eine Ahnung. ;)

Eine Sache noch... wenn nun
http://domain.de/verzeichniss/index, also ohne Dateiendung angefragt wird, liefert der Server das Dokument aus ohne die Url umzuschreiben.

Ich müsste doch „nur“ noch die Dateiendungen optional machen um http://domain.de/verzeichniss/index auf http://domain.de/verzeichniss/ umzuleiten, oder?
 
Das habe ich schon vor der Fragestellung ausprobiert. Das funktioniert leider nicht...:confused:

Code:
RewriteCond %{THE_REQUEST} ^GET\ /(.+/)?index\.(html|php)?\ HTTP/
RewriteRule index\.(html|php)$ /%1 [R=301]
 
Code:
RewriteCond %{THE_REQUEST} ^GET\ /(.+/)?index(\.(html|php))?\ HTTP/
RewriteRule index(\.(html|php))?$ /%1 [R=301]
 
Zurück