Hallo Forumsgemeinde!
Ich hätte da noch ein paar Fragen zu mod_rewrite. Selbst nach ausgiebigem Studium der entsprechenden Apache Dokumentationen und etlicher Tutorials dazu, habe ich immer noch gewisse Verständnisschwierigkeiten. Ich hoffe, ein paar davon mit eurer Hilfe beseitigen zu können.
Ich plane gerade für ein neues Projekt. Dabei sollen die Seiten dynmisch generiert werden, aber nach aussen hin durch kanonische (sprechende) URIs repräsentiert werden.
Zu diesem Zwecke verwende ich das mod_rewrite Modul des Apachen.
Folgendes habe ich bis jetzt zu Wege gebracht:
Das Projekt ist unter einer Subdomain beheimatet. Diese existiert wiederum unter zwei TLDs. Eine davon habe ich zur Hauptdomain gemacht.
http://sub.example.com/ => http://sub.example.de/
http://www.example.com/sub/ => http://sub.example.de/
http://www.example.de/sub/ => http://sub.example.de/
Diese RewriteRules habe ich direkt in die jeweiligen VirtualHost Abschnitte der conf gepackt.
Jetzt sollen alle Seitenaufrufe intern an die Datei index.php (im Root) weitergeleitet werden und die Adresse in der Browserzeile noch bei Bedarf "verschönert" werden. Dazu habe ich im Verzeichnis http://sub.example.de/ folgende .htaccess:
RewriteEngine on
do the rewrite
RewriteCond %{REQUEST_FILENAME} !-F
RewriteCond %{REQUEST_FILENAME} !^/var/www/web1/html/css/index.php$ [NC]
RewriteCond %{REQUEST_URI} ^(.*)(.|.htm|.html|.xhtml|.dhtml|.php|.php3|.php4|.php5)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)/$
RewriteRule ^(.*)(.|/|.htm|.html|.xhtml|.dhtml|.php|.php3|.php4|.php5)$ http://%{HTTP_HOST}/$1 [R=301,QSA,L]
RewriteCond %{REQUEST_FILENAME} ^/var/www/web1/html/css/index$ [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST} [R=301,QSA,L]
RewriteCond %{REQUEST_FILENAME} ^/var/www/web1/html/css/index.php$ [NC]
RewriteCond %{QUERY_STRING} !^page=.*$
RewriteRule ^(.*)$ http://%{HTTP_HOST} [R=301,QSA,L]
RewriteCond %{REQUEST_FILENAME} !-F
RewriteCond %{REQUEST_FILENAME} !^/var/www/web1/html/css/index.php$ [NC]
RewriteRule ^(.*)$ index.php?page=$1 [QSA,L]
Das (zumindest scheint es so) funktioniert soweit auch wie beabsichtigt. Aus Performancegründen würde ich das Ganze ja auch lieber direkt in den VirtualHost Abschnitt packen, aber wenn ich das tue, funktioniert es nicht mehr wie gewünscht, sondern produziert einen 400 Bad Request.
Aber nun (endlich) zu meiner eigentlichen Frage:
Es gibt ja unter mod_rewrite etliche Flags mit denen sich u.a. auch Umgebungsvariablen und Cookies setzen lassen.
Um möglichst keine GET-Parameter an den URLs "kleben" zu haben, würde ich gerne Cookies verwenden. Nun ist ja (leider) das alte Thema das, dass man nicht davon ausgehen kann, dass jeder Client Cookies handeln kann, bzw. auch akzeptiert. Das einzige mir bekannte Prüfverfahren besteht also darin, dem Client ein Cookie zu senden und beim nächsten Request des Clients zu prüfen, ob das Cookie mitgesendet wurde.
Das Problem besteht also (hauptsächlich) darin, dass es immer eines neuen Requests bedarf.
Frage: Kann man das auch mit Hilfe von mod_rewrite irgendwie erreichen?
Ich könnte also bspw. irgendwo ein Cookie setzen mit
RewriteRule ^.*$ - [CO=acceptCookies:yes:sub.example.de:60:/]
(soweit so gut).
Nur wie kann ich jetzt den neuen Request erreichen? Denn ein Redirect [R] scheint das Problem nicht zu lösen, oder mache ich etwas falsch?
Überhaupt würde ich gerne noch ein paar Dinge für mein Verständnis nachfragen:
-
Eins der größeren Probleme bereitet mir das Verstehen, wie oft und wann eigentlich überhaupt die einzelnen RewriteRules geprüft und angewendet werden. Ist es richtig, dass die RewriteRules abgearbeitet werden, bis daraus ein Redirect resultiert (dann geht es wieder von vorne los?), oder ein [L] Flag auftaucht?
-
Was bewirken die Flags [NS] und [PT]? NS steht für 'Skip if internal subrequest'. Aber wann ist ein Request ein SUB-Request und wodurch entsteht er? PT steht für 'pass trough'. Wozu wird das gebraucht/ verwendet?
-
Cookies und/ oder Umgebungsvariablen zu setzen bereitet mir keine Problem. Jedoch habe ich Schwierigkeiten, diese zu überprüfen. Wenn ich bspw. in einer Rule die folgende Umgebungsvariable setze: [E=CA:yes], dann sollte ich sie doch eigentlich per: RewriteCond %{ENV:CA} ^yes$ abfragen können? Analog bei den Cookies: RewriteCond %{HTTP_COOKIE} ^acceptCookies=yes$ ,bzw. RewriteCond %{CO:acceptCookies} ^yes$. Funktioniert aber nicht. Was mache ich falsch und/ oder wo liegt mein (Denk-)Fehler? Wie sieht es mit der Gültigkeit, bzw. der Lebensdauer von so gesetzten Variablen aus (nur bis zu einem Redirect oder auch darüber hinaus)?
Ich bin für jede Hilfe und jeden Tipp/ Hinweis dankbar. Ich komme alleine mit meinem Verstehen der Geschichte nicht mehr weiter.
Natürlich würde ich mich auch sehr freuen, wenn mir jemand eine performantere Version meiner bisherigen RewriteRules nennen könnte.
Also wie immer - meinen besten Dank im Voraus für jegliche Hilfe!
Gruß Gunther
PS: Bitte nicht als Doppelposting deklarieren. Ich weiss, dass ich hier bereits einen ähnlichen Thread habe. Aber das dort angesprochene Problem war ein anderes und der Umfang meiner neuen Fragen & Probleme rechtfertigt (hoffentlich) einen neuen Thread - Danke!