Hallo wahsaga,
vielen Dank für deine Geduld & Ausdauer mit mir und meinem mod-rewrite Problem! :-)
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.
Damit weißt du, dass der Client also den Cookie mit diesem Request wieder mitgesendet hat.
Dass dies beim nächsten Request nicht mehr der Fall sein _muss_, sollte auf jeden Fall bewusst sein (auch wenn vielfach davon ausgegangen wird, macht PHP bei der Übertragung seiner Session-ID ja auch nicht anders).
Hmm, das verstehe ich nicht ganz. Ich dachte gerade darin besteht der wesentliche Vorteil von Cookies, dass sie solange sie gültig (not expired) sind, immer mitgesendet werden (im Gegensatz zu GET-Parametern, die jedesmal manuell angehängt werden müssen)? Wie stelle ich denn sicher, dass das Cookie bei jedem Request mitgesendet wird?
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?Wie hast du's denn gemacht?
Siehe meine .htaccess. Oben habe ich dann bspw. noch folgende Rule eingefügt:
RewriteRule ^.*$ - [CO=aCookies:5:sub.example.de:60:/]
(matched ja auf jeden Fall immer, verändert den Request nicht und setzt den/ das Cookie)
(Ich bin mir nicht sicher, wie Clients auf einen Redirect reagieren, wenn dieser sie wieder zur selben Adresse schicken möchte.)
Und wenn das so geht, dann musst du natürlich auch abprüfen, ob beim nächsten Request der Cookie wieder mitgeschickt wurde - und dann nicht wieder erneut umleiten.
Das Prüfen des Cookies ist ja u.a. eins meiner Probleme (siehe Ausgangsposting). Und umleiten muss ich eigentlich immer, da ein Request ja typischerweise so aussieht: http://sub.example.de/ein-artikel und intern weitergereicht wird an: http://sub.example.de/index.php?page=ein-artikel
Ü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?
Hast du den Abschnitt zum Ruleset Processing schon gelesen?
Ja. Also ist es richtig, dass jeder Redirect ein neuer Request ist, bei dem alles wieder von vorne durchgegangen wird!?
- 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?
Auch das sollte beim Durcharbeiten des Processing-Abschnittes deutlich werden.
PT steht für 'pass trough'. Wozu wird das gebraucht/ verwendet?
Um das Ergebnis des Rewritings an den nächsten Handler weiterzugeben.
Ich habe (glaub ich zumindest) keine anderen Handler, die da noch etwas tun müssten. Bricht also dann das Ausführen einer RewriteRule mit dem [PT] Flag die Abarbeitung der übrigen RewriteRules ab!?
"You must use this flag if you want to mix directives from different modules which allow URL-to-filename translators. The typical example is the use of mod_alias and mod_rewrite."
OK, wie gesagt kommt mod_alias in dem betreffenden Fall nicht zum Einsatz.
Das Kapitel Mapping URLs to Filesystem Locations könnte diesbezüglich auch noch ausschlussreich sein.
- 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)?
M.E. müsste diese so lange andauern, bis der Apache den Request abgearbeitet hat.
"The variables can later be dereferenced in many situations, most commonly from within XSSI (via <!--#echo var="VAR"-->) or CGI ($ENV{'VAR'}). You can also dereference the variable in a later RewriteCond pattern, using %{ENV:VAR}."
Also da ja alle meine Requests auf die index.php umgeleitet werden, ich teste das folgendermaßen:
print_r($_ENV);
Da tauchen auch diverse Variablen auf, nur keine, die ich per mod_rewrite Flag gesetzt habe (bspw. per: [E=CA:yes]).
Bei einem Redirect allerdings _ist_ er ja erst mal fertig, und übergibt die Steuerung wieder an den Client. Da ist die Umgebungsvariable also definitiv futsch.
Ist denn aber nicht in die interne Umleitung auf meine index.php (im Normalfall) die letzte Umleitung und müsste nicht eine dort gesetzte Variable erhalten bleiben?
Noch eine neue Frage: Gibt es eigentlich eine Möglichkeit, einen evt. vorhandenen Querystring in der Adresszeile "abzuschneiden"_und_trotzdem intern (index.php) weiterzuverarbeiten? Bisher gehe ich davon aus, dass das nicht möglich ist. Denn eine Änderung in der Adresszeile kann ich doch nur durch einen Redirect erreichen. Und entweder schneide ich den Querystring dabei ab, oder ich hänge ihn per QSA-Flag wieder an. Richtig?
Gruß Gunther