Hallo,
ich finde den Sinn dieses Ansatzes fragwürdig, aber darum geht es an dieser Stelle nicht.
Zu deinem Problem:
Code:
RewriteRule ^/?([a-zA-Z]+)$ $1.php [L]
Diese Zeile ist für das anhängen des .php an die URL zuständig. Mit dem regex für den Match triffst du aber diverse URLs nicht.
Kurz zum Verständnis, wofür die einzelnen Bereiche in dem Ausdruck stehen
^ => Der gesuchte Bereich muss am Anfang der Zeile beginnen
/ => Suche nach dem string "/"
? => Das zuvor folgende Zeichen ist optional
() => Ein Teilbereich, der in einer Variable bereitgestellt wird
[a-zA-Z] => Trifft ein Zeichen von a-z oder A-Z (Das umfasst nicht äöüÄÖÜ)
+ => Das zuvor angegebene Zeichen muss einmal vorkommen, kann aber beliebig oft wiederholt werden
$ => Der gesuchte Bereich muss bis zum Ende der Zeile reichen
Jetzt ein paar Beispiele, wie die Ersetzungen vermutlich aussehen
Code:
/test => test.php
test => test.php
unterordner/test => Regel trifft nicht zu, es ist ein ungültiges Zeichen enthalten
täst => Regel trifft nicht zu, es ist ein ungültiges Zeichen enthalten
Zu den beiden Regeln, die nicht zutreffen:
Der / führt dazu, dass der Bereich [a-zA-Z] nicht mehr wahr ist. Das gleiche gilt für t
äst
Um das Problem zu lösen, können wir einfach die erlaubten Zeichen erweitern (vermutlich nicht die beste Lösung)
Code:
RewriteRule ^/?([a-zA-ZäöüÄÖÜ/]+)$ $1.php [L]
Das setzt aber voraus, dass wir die Datei im gleichem Encoding haben, wie die URLs die rein kommen. Ist also eher fehleranfällig. Außerdem muss du für jedes weitere Zeichen den Ausdruck wieder anpassen.
Mein Vorschlag wäre, wenn das auf deine Anforderungen passt:
Code:
RewriteRule ^(.*)$ $1.php [L]
Das wird aber in Zusammenhang mit deiner RewriteCond Probleme machen. Eine RewriteCond ist immer nur für die nachfolgende RewriteRule zuständig. Damit würde unsere Letzte RewriteRule zu einer endlosen Weiterleitung führen. Man könnte die Cond jetzt für jede Zeile wiederholen, das wäre aber nicht sonderlich schön. Es gibt einen kleinen Trick, wie man das Umgehen kann: Wir fügen eine weitere RewriteRule ein, die den Parameter Skip verwendet und auf alle URLs zutrifft. Das heißt, wenn diese Regel mit der davor stehenden Regel zutrifft werden die nächsten x Regeln übersprungen.
Beispiel:
Code:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .? - [S=4]
RewriteRule ^(.*)(ae)(.*) /unterordner/$1ä$3 [L,R=301]
RewriteRule ^(.*)(oe)(.*) /unterordner/$1ö$3 [L,R=301]
RewriteRule ^(.*)(ue)(.*) /unterordner/$1ü$3 [L,R=301]
RewriteRule ^(.*)$ $1.php [L]
Nun noch eine Anmerkung zu deiner Ersetzung der Umlaute: Diese Variante der Ersetzung führt dazu, dass für jede Umlautersetzung in der URL eine neue Anfrage an den Server gestellt wird. Kurz zum Ablauf
1. Client fragt URL "/taest/taest/taest" am Server an
2. Server antwortet: Verwende bitte die URL "/taest/taest/täst"
3. Client fragt URL "/taest/taest/täst" am Server an
4. Server antwortet: Verwende bitte die URL "/taest/täst/täst"
Das ist von der Performance her nicht wirklich schön. Außerdem würdest du mit der Ersetzung auch Wörter treffen, die du nicht ersetzen möchtest. Nehmen wir z. B. die Sofaecke aus der eine Sofäcke wird.
Jetzt doch noch zu dem Ziel, dass du verfolgst: Ich würde prinzipiell immer jedem davon abraten Umlaute in Dateinamen und URLs zu verwenden, außer es gibt dafür einen vernünftig erklärbaren Grund.
Ich hoffe du hast soweit einiges Verstanden. Solltest du noch Fragen dazu haben, einfach nachfragen
VG
Nino