Sebastian: Probleme mit der ReWrite-Engine

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

  1. Hmm, OK. Offenbar ist .* in dem Fall nicht der richtige Ausdruck um "alles" zu beschreiben. Hab jetzt stattdessen mal [0-9a-z-]+ genommen.

    1. 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.