Gunther: mod_rewrite: Fehler in der .htaccess

Beitrag lesen

Hallo Willi,

RewriteRule   ^([1]*)$ $1.php

Mit Deinem gierigen RegExp wundert mich das nicht. Schau mal passiert:
^: Beginn des Strings (Nullzeichen)

Nur hier gibst Du keine Begrenzung! Was passiert also? index wird zu index.php gewandelt, da greift aber wieder die RegExp: Im String index.php steht ja nichts davor (^), ist kein slash und kein Unterstrich enthalten ([1:1]), besteht aus 0 bis vielen Zeichen bis zum Stringende, also wird versucht wieder umzuleiten zu $1.php, was jetzt index.php.php ist und auch gematcht wird; nach ein paar mal hast Du index.php.php.php.php.php.php.php - und es passt immer noch zum Suchmuster. Die Ressource gibt es nicht.

Stimmt.
Aber genau deswegen gibt es doch die RewriteConds:
RewriteCond   %{REQUEST_FILENAME}   !-d
RewriteCond   %{REQUEST_FILENAME}   !-f
Nur wenn es die Datei unter diesen Namen nicht gibt, wird weitergeleitet. Nach dem ersten Umleiten von index auf index.php sollte doch *eigentlich* daher nicht mehr umgeleitet werden - oder?

Es kommt auf die Reihenfolge an. Durch die gebräuchliche Form der Notation, erst die RewriteCondition(s) und dann die RewriteRule(s) zu notieren, ist man geneigt, auch diese Reihenfolge für das Abarbeiten anzunehmen. Dem ist aber nicht so. Sondern es werden _erst_ die Rules geprüft ob sie matchen und nur wenn dem so ist, werden _anschließend_ die Conditions geprüft. Und nach jedem "Treffer", also dem Matchen einer Rule, beginnt quasi einer neuer Durchlauf, d.h. beginnt das Spielchen von vorne. Daher muss man unbedingt darauf achten, dass eine Veränderung durch eine Rule anschließend nicht mehr matched, da ansonsten wie bei dir eine Endlosschleife eintritt.

Gruß Gunther


  1. kein slash und kein Unterstrich
    *: keins oder beliebig viele Zeichen bis
    $: Stringende ↩︎ ↩︎