Rolfi: mod_rewrite

Beitrag lesen

Ola dedlfix,

Nein. Zuerst wird eine passende RewriteRule gesucht. Wobei ^$ nur auf "leere" Requests passt, .* hingegen auf alle. Dann werden die vor dieser RewriteRule stehenden RewriteCond ausgewertet. Wenn die alle passen, dann wird der Request zum in der Rule angegebenen Ziel umgeschrieben, ansonsten wird die RewriteRule doch noch ignoriert.

Das ist wirklich sehr gut zu wissen, wie das funktioniert!! Dachte das geht immer andersrum.

Wenn du nun eine RewriteRule hast, die auch auf diese (und andere vorhandene Dateien) passt, dann kannst du mit einer !-f RewriteCond die Ausführung des Rewrites verhindern.

Das dachte ich ja "auch", dass ich es so verhindern kann. Aber anscheinend habe ich einen Fehler gemacht, den ich nicht finden kann.

Ich analysiere das mal. Ich habe eine echte existente Datei namens "google-kasgdkuaskd7q72dhd.html"

RewriteCond %{REQUEST_URI} !-f  
RewriteCond %{HTTP_HOST} ^domainname\.(.*) [NC]  
RewriteRule ^$ index.php?d=%1&k=index [QSA]

Wie du richtig feststellst, erwartet ^$ einen leeren Request. Es steht also nichts hinter der Domain. Also wird nur was getan, wenn man direkt die Seite mit domainname.de oder welcher TLD auch immer, aufruft. Es wird hier nicht automatisch in vorhandene Dateien gegangen wie einer index.html oder index.php, da es vorher abgefangen wird. !-f trifft auch zu, da ein leerer Request keine Datei sein kann. Als Schlussfolgerung ziehe ich, dass "google-kasgdkuaskd7q72dhd.html" in diese RewriteRule nicht reinfällt.

Nun der nächste Baustein, wenn denn eine Seite aufgerufen wird.

RewriteCond %{REQUEST_URI} !-f  
RewriteCond %{HTTP_HOST} ^domainname\.(.*) [NC]  
RewriteRule ^([-\w]+)\.html$ index.php?d=%1&k=$1 [QSA]

Es wird ein Request gesucht, der unbedingt mit einem Dateinamen anfängt der dabei den Bindestrich und Buchstaben/Zahlen enthalten kann. Er muss mit der Dateiendung .html enden. Nun geht er in die RewriteCond %{HTTP_HOST} und prüft ob er auf der Domain "domainname" ist und nimmt dann entsprechend die TLD am Ende weg um sie der RewriteRule anzufügen. Nun geht er in die letzte RewriteCond. Da die Datei "google-kasgdkuaskd7q72dhd.html" jedoch existiert, trifft diese RewriteCond nicht mehr zu, denn !-f steht ja dafür, dass "wenn die Datei nicht existiert", so wie du es auch sagst. Ab hier kommt es zu meinem Verständnisproblem, warum die Datei "google-kasgdkuaskd7q72dhd.html" dennoch in die RewriteRule fällt, obwohl sie existiert.

mfg,
Rolfi