Probleme mit der ReWrite-Engine
Sebastian
- webserver
Hallo,
ich arbeite zum ersten Mal so richtig mit .htacces und Co, funktioniert aber nicht so wie gedacht :) Ich habe ein CMS programmiert, die einzelnen Seiten sind mit
www.meinedomain.de/index.php?path=seite
zu erreichen. Nun will ich aber mit schönen URLs arbeiten als entsprechend umleiten. Zum beispiel soll eben
www.meinedomain/kontakt
zu
www.meinedomain/index.php?path=kontakt
umgeleitet werden usw. Dazu sieht meine .htacces folgendermaßen aus
Options +FollowSymlinks
RewriteEngine on
RewriteBase /
RewriteRule ^(.*)$ index.php?path=$1
Funktioniert aber nicht. Als path wird immer "index.php" eingetragen, und nicht das, was man in die Browserzeile schreibt. Und offenbar liegt es an dem Ausdruck ^(.*)$. Wenn ich einfach nur ^(.)$ schreibe, dann funktioniert es, also eben logischerweise mit nur einem Zeichen. Also www.meinedomain.de/x wird dann wirklich zu www.meinedomain/index.php?path=x umgeleitet. Ebenso wenn ich einfach mehrere Punkte setze und eine entsprechend genauso lange beliebige Zeichenkette eingebe.
Außerdem funktioniert es, wenn ich vor den Platzhalter beliebige Zeichenketten anfüge. Also z.B.
RewriteRule ^xyz(.*)$ index.php?path=$1
Wenn ich nun in die Browserzeile www.meinedomain.de/xyzkontakt eingebe, dann wird wirklich zu www.meinedomain.de/index.php?path=kontakt umgeleitet
Hmm, OK. Offenbar ist .* in dem Fall nicht der richtige Ausdruck um "alles" zu beschreiben. Hab jetzt stattdessen mal [0-9a-z-]+ genommen.
Tach!
Offenbar ist .* in dem Fall nicht der richtige Ausdruck um "alles" zu beschreiben. Hab jetzt stattdessen mal [0-9a-z-]+ genommen.
Doch, .* steht für alles und das schließt die index.php mit ein, was die Problemursache ist. Nach solch einem Umschreiben schickt mod_rewrite die neu gebildete URL intern erneut in die Request-URL-Auflösungsmaschine. Diese kommt wieder an deiner Regel vorbei, diesmal mit index.php (der Rest ist Querystring und wird von den Umschreib-Regeln ignoriert). Das passt ebenfalls und wird erneut umgeschrieben. Dein Ausdruck [0-9a-z-]+ jedoch enthält keinen Punkt, weswegen die Regel nicht mehr auf index.php passt.
Man kann das Problem auch ohne Einschränkung auf bestimmte Zeichen lösen, indem man der RewriteRule Bedingungen voranstellt:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Diese schließen real existierende Dateien und Verzeichnisse von der Regel aus.
dedlfix.