Kleines .htaccess Problem RewriteRule

maxx3

Grünschnabel
Hallo liebe tutorials.de User,

ich habe folgendes Problem, und zwar möchte ich mit meiner htaccess function folgendes erreichen.

Ich möchte, dass die Endungen .php auch ohne Anhang im Browser erreichbar sind zusätzlich möchte ich, dass Umlaute wie ue auch durch ein ü ersetzt werden können.

Die Funktion mit den Umlauten funktioniert allerdings funktioniert die Ausblendung meiner .php Endung nicht, hier mal mein Inhalt der .htaccess

PHP:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
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 ^/?([a-zA-Z]+)$ $1.php [L]

Vielen Dank vorab für Eure Hilfe!

LG
 
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
 
Zurück