Tach!
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.
Die RewriteConds kommen gar nicht zur Auswertung, weil die Rule nicht matcht. Es ist in dem Fall also egal, was für Conds da stehen. Und die erste RewriteCond ist in jedem Fall überflüssig (selbst mit der Korrektur - siehe nachfolgend).
> Nun der nächste Baustein, wenn denn eine Seite aufgerufen wird.
> ~~~apache
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.
Es gibt ein RewriteLog, das zeigt genau, wann was in welcher Reihenfolge passiert oder nicht. Da muss man nicht raten. Allerdings kann diese Direktive nur im Server/VHost-Kontext gesetzt werden.
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.
Weil du nicht %{REQUEST_FILENAME} sondern %{REQUEST_URI} untersuchst. Teste mal nacheinander
RewriteCond %{REQUEST_URI} (.*)
RewriteRule ^([-\w]+).html$ test.php?x=%1 [QSA]
RewriteCond %{REQUEST_FILENAME} (.*)
RewriteRule ^([-\w]+).html$ test.php?x=%1 [QSA]
Und in der test.php ein <pre><?php print_r($_GET);
%{REQUEST_URI} ergibt keinen im System vorhandenen Dateinamen.
dedlfix.