Ik ben bezig met het schrijven van mijn eigen Session class in PHP5.
Om gebruik te kunnen maken van friendly URLs heb ik mod_rewrite aangezet in mijn .htaccess:
Wanneer ik nu een pagina opvraag blijkt deze twee keer per request opgevraagd te worden. Dit komt door de mod_rewrite. Wanneer ik RewriteEngine off neer zet, wordt de pagina maar 1 keer per request opgevraagd, zoals men zou verwachten. Tot zover geen probleem.
Neem nu de volgende code van mijn Session object:
Met RewriteEngine off geeft deze code in Firefox na 2 page refreshes:
En in Opera:
Tot zover verloopt alles zoals verwacht. De eerste keer is er geen cookie geset, dus is de cookie leeg. Bij de tweede request is de sessie geset en laat hij deze netjes zien.
Vervolgens zetten we ReqriteEngine on.
Omdat alle requests nu gerewrite worden, verwacht ik in de log 4 entrys te zien.
Wederom de output van Firefox na 2 requests:
Opera na 2 requests:
Wat we hier zien is dat Firefox 2 keer zovaak in de log heeft geschreven. Echter is bij de eerste request de cookie leeg en vervolgens altijd geset.
Bij Opera zie ik de vier verwachtte logs verschijnen, alleen blijkt bij de 2e request de cookie leeg te zijn.
Het probleem is dat ik de sessie in de database wil opslaan. Omdat Opera bij de tweede keer (na de rewrite) de cookie leeg gooit, maakt het sessie object een nieuw ID aan. Hierdoor wordt de database vol gezet met unieke ID's. Dit is niet de bedoeling. Hoewel Firefox vaker in de logs voorkomt, is zijn data wel bruikbaar omdat hij netjes ziet dat de cookie al een ID bevat en hij dus geen nieuw ID in de database hoeft te zetten.
Ik vermoed dan ook dat het probleem in de htaccess zit. Wellicht moet ik iets doen met een RewriteRule en %{HTTP_COOKIE}. Echter heb ik niet veel kaas van rewrite rules gegeten. Ik hoop dat 1 van jullie mij uit de brand kan helpen!
Om gebruik te kunnen maken van friendly URLs heb ik mod_rewrite aangezet in mijn .htaccess:
code: .htacces
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # Disable open directory protocol Options -Indexes # Enable friendly urls RewriteEngine on RewriteBase / # Allow direct access to files with the following extensions: RewriteCond $1 !\.(html|css|js|xml|txt|ico)$ # Allow direct access to the following directories relative to the webroot: RewriteCond $1 !^(img|css|js|index\.php) # Rewrite URL for PHP parsing RewriteRule ^(.*)$ index.php/$1 [L] |
Wanneer ik nu een pagina opvraag blijkt deze twee keer per request opgevraagd te worden. Dit komt door de mod_rewrite. Wanneer ik RewriteEngine off neer zet, wordt de pagina maar 1 keer per request opgevraagd, zoals men zou verwachten. Tot zover geen probleem.
Neem nu de volgende code van mijn Session object:
PHP: Session.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| <?php class Session { private $id = false; public function __construct() { if ( isset($_COOKIE['sessie']) ) $this->id = $_COOKIE['sessie']; var_dump($this); $this->createSession(); } private function createSession() { $f = fopen('d:/test.txt', 'a+'); fprintf($f, "Cookie: '%s'\r\n", $_COOKIE['sessie']); fclose($f); if ( $this->id ) { print "Cookie sessie exists with ID '{$this->id}'<br>"; } else { $this->id = $this->generateID(); setcookie('sessie', $this->id); print "Creating cookie with ID '{$this->id}'<br>"; } var_dump($_COOKIE); var_dump($this); } private function generateID() { return hash('sha256', uniqid(rand(), true)); } } ?> |
Met RewriteEngine off geeft deze code in Firefox na 2 page refreshes:
Cookie: '' Cookie: 'e32ff5b95ddec0c2c071e9ebeca58ab1f754bfe706b03d2e2f55710485c15401'
En in Opera:
Cookie: '' Cookie: '3e0a4f8a363a8abb896cba546c0d4ff05017ef5974310ec5d8730967f3bf57b1'
Tot zover verloopt alles zoals verwacht. De eerste keer is er geen cookie geset, dus is de cookie leeg. Bij de tweede request is de sessie geset en laat hij deze netjes zien.
Vervolgens zetten we ReqriteEngine on.
Omdat alle requests nu gerewrite worden, verwacht ik in de log 4 entrys te zien.
Wederom de output van Firefox na 2 requests:
Cookie: '' Cookie: '5b0a4022f6b7d7c8529998d14d7e3107273b8a8ac36514452427f93098398932' Cookie: '5b0a4022f6b7d7c8529998d14d7e3107273b8a8ac36514452427f93098398932' Cookie: '5b0a4022f6b7d7c8529998d14d7e3107273b8a8ac36514452427f93098398932' Cookie: '5b0a4022f6b7d7c8529998d14d7e3107273b8a8ac36514452427f93098398932' Cookie: '5b0a4022f6b7d7c8529998d14d7e3107273b8a8ac36514452427f93098398932' Cookie: '5b0a4022f6b7d7c8529998d14d7e3107273b8a8ac36514452427f93098398932' Cookie: '5b0a4022f6b7d7c8529998d14d7e3107273b8a8ac36514452427f93098398932'
Opera na 2 requests:
Cookie: '' Cookie: '' Cookie: '5c9b0ec198f33a0f224601414a3aead85d2e06915eca4d114814c2c08a79db07' Cookie: ''
Wat we hier zien is dat Firefox 2 keer zovaak in de log heeft geschreven. Echter is bij de eerste request de cookie leeg en vervolgens altijd geset.
Bij Opera zie ik de vier verwachtte logs verschijnen, alleen blijkt bij de 2e request de cookie leeg te zijn.
Het probleem is dat ik de sessie in de database wil opslaan. Omdat Opera bij de tweede keer (na de rewrite) de cookie leeg gooit, maakt het sessie object een nieuw ID aan. Hierdoor wordt de database vol gezet met unieke ID's. Dit is niet de bedoeling. Hoewel Firefox vaker in de logs voorkomt, is zijn data wel bruikbaar omdat hij netjes ziet dat de cookie al een ID bevat en hij dus geen nieuw ID in de database hoeft te zetten.
Ik vermoed dan ook dat het probleem in de htaccess zit. Wellicht moet ik iets doen met een RewriteRule en %{HTTP_COOKIE}. Echter heb ik niet veel kaas van rewrite rules gegeten. Ik hoop dat 1 van jullie mij uit de brand kan helpen!