hi,
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).
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?
(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.
Ü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?
- 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.
"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."
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}."
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.
gruß,
wahsaga
/voodoo.css:
#GeorgeWBush { position:absolute; bottom:-6ft; }