Verständnisfrage zu htaccess

tomate

Erfahrenes Mitglied
Hallo zusammen,

ich habe dies Zeile in einer htaccess-Datei stehen:
Code:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?qs=$1 [L]

Ziel ist es, alle Parameter nach der TLD (Top Level Domain) als Wert an die index.php zu übergeben.
Das ganze funktioniert sowei auch. Nur kann ich nicht ganz nachvollziehen, wieso :)

Alles was diese RewriteRule findet wird ja in $1 gespeichert.
Angenommen ich habe nun z. B. dies Adresse >http://www.tutorials.de/kontakt<, dann wird in $1 der String kontakt gespeichert.

Wer sagt der RewriteEngine eigentlich, daß erst alles nach dem http://www.tutorials.de/ in $1 gespeichert werden soll?
Kann man das irgendwie einstellen, oder ist das fest implementiert?

Die Angabe >RewriteCond %{REQUEST_FILENAME} !-f< bedeuted doch, das der Wert in $1 kein keine Datei sein darf?!
Sprich, wenn $1 eine Datei wäre, würde die Rule nicht starten. Ist das soweit richtig?

Wenn ja, wie erkennt die RewriteCond eigentlich überhaupt, das kontakt.php eine Datei ist?

Viele Grüße und Danke - Tomate
 
Wer sagt der RewriteEngine eigentlich, daß erst alles nach dem http://www.tutorials.de/ in $1 gespeichert werden soll?
mod_rewrite ist ein Apache-Modul, und als solches hat es natürlich auch die gleichen Fähigkeiten, wie Apache selbst. Woher weiß Apache denn, das du mit http//www.tutorials.de/index.php auf eine Datei zugreifen willst? Es steht nirgends geschrieben, das es nicht auch einen Ordner mit dem Namen index.php geben darf. Zugegeben, das wäre etwas blödsinnig und niemand würde das machen. Aber möglich wäre es. Somit kann die Frage nur damit beantwortet werden, dass Apache im Datei-Sytem nach schaut, was es denn nun eigentlich ist (Erklärung mit deiner letzten Frage). Dabei wird ein Domänenname auf ein lokales Verzeichnis, ein sog. DocumentRoot gemappt. Alles was also nach dem Domänennamen kommt, muss im lokalen Dateisystem existieren, wenn auch nur virtuell.

Kann man das irgendwie einstellen, oder ist das fest implementiert?
Nein und ja. mod_rewrite kann bei %{REQUEST_FILENAME}, wie schon erwähnt, nur im lokalen Dateisystem operieren.

Die Angabe >RewriteCond %{REQUEST_FILENAME} !-f< bedeuted doch, das der Wert in $1 kein keine Datei sein darf?!
Sprich, wenn $1 eine Datei wäre, würde die Rule nicht starten. Ist das soweit richtig?
So kann man das sehen. Und da die Kondition (kein Verzeichnis) auch noch hinten anhängt, trifft deine Rule also nur auf nicht-existente Verzeichnis-Einträge zu.

Wenn ja, wie erkennt die RewriteCond eigentlich überhaupt, das kontakt.php eine Datei ist?
mod_rewrite ist in C geschrieben und kann den Typ eines Verzeichnis-Eintrags mittels der glibc-Funktion stat() herausfinden.

Zusätzlich möchte ich dich noch auf diese schöne Seite leiten.
 
Hi,

was hat deine Verständnisfrage zur .htaccess-Datei bzw. zum mod_rewrite-Modul speziell mit PHP zu tun, blos weil da eine index.php-Datei im Spiel ist?

Von daher leite ich das Thema ins Forum für "Hosting & Webserver" weiter.

mfg Maik
 
@saftmeister
Sehr gute Erklärung - Danke

@Maik: Sorry für das plazieren im falschen Bereich.

Viele Grüße und Danke - Tomate
 

Neue Beiträge

Zurück