Beste mensen, ik heb een situatie waarin ik afbeeldingen uit de database haal, en moet serveren als 'statische' content.
De afbeeldingen wijzigen nooit, maar kunnen wel verwijderd worden. o.a. om ref. integriteit af te dwingen staan ze in een DB.
Ik heb nu de volgende php file om mijn afbeelding te serveren:
de headers die ik in firebug terug zie zijn de volgende
ik heb dit topic gelezen, maar dit beantwoord niet helemaal mijn vragen:
php en image caching
Wat ik dus nu doe is netjes een 304 sturen als ik de if-modified-since krijg (maar die krijg ik volgens mij nooit)
verder heb ik een last modified en expires date opgegeven. Mijn last modified komt ook uit de DB, en die is dus elke keer hetzelfde, en ligt in het verleden.
De expires ligt in de toekomst.
Toch blijft mijn firefox requests naar de server sturen, en haalt niks uit de cache...
wat doe ik fout?
gooit die pragma header roet in het eten? die komt uit firefox.. waarom staat daar no-cache?
De afbeeldingen wijzigen nooit, maar kunnen wel verwijderd worden. o.a. om ref. integriteit af te dwingen staan ze in een DB.
Ik heb nu de volgende php file om mijn afbeelding te serveren:
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
| $id = mysql_real_escape_string($_GET['id']); $query = "SELECT *, UNIX_TIMESTAMP(timestamp) as ticks FROM `" . $ucms_cfg['prefix'] . "image_image` WHERE id = '$id'"; $row = mysql_fetch_object(mysql_query($query)); $ar = getHeaders(); //deze haalt de request headers op; if (isset($ar['If-Modified-Since']) && // If-Modified-Since should exists $ar['If-Modified-Since'] != '' && // not empty strtotime($ar['If-Modified-Since']) >= $row->ticks) // and greater than { // Sending 304 response to browser // "Browser, your cached version of image is OK // we're not sending anything new to you" header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $row->ticks) . ' GMT', true, 304); exit(); } header('Cache-Control: public'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $row->ticks) . ' GMT', true, 200); header('Expires: ' . gmdate('D, d M Y H:i:s', $row->ticks + 86400*365) . ' GMT', true, 200); header("Content-length: ".strlen($row->image)); header("Content-type: $row->type"); switch ($row->type) { case "image/gif": header("Content-disposition: inline; filename=image.gif"); break; case "image/jpeg": header("Content-disposition: inline; filename=image.jpg"); break; case "image/png": header("Content-disposition: inline; filename=image.png"); break; } echo $row->image; |
de headers die ik in firebug terug zie zijn de volgende
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| Response Headers Date Fri, 15 Apr 2011 13:58:31 GMT Server Apache/2.2.15 (Unix) mod_ssl/2.2.15 OpenSSL/0.9.7a mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 mod_perl/2.0.4 Perl/v5.8.8 X-Powered-By PHP/5.2.13 Pragma no-cache Cache-Control public Expires Sat, 14 Apr 2012 12:04:26 GMT Content-Disposition inline; filename=image.jpg Last-Modified Fri, 15 Apr 2011 12:04:26 GMT Content-Length 26880 Keep-Alive timeout=5, max=99 Connection Keep-Alive Content-Type image/jpeg Request Headers User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0 Accept image/png,image/*;q=0.8,*/*;q=0.5 Accept-Language en-gb,en;q=0.5 Accept-Encoding gzip, deflate Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive 115 Connection keep-alive |
ik heb dit topic gelezen, maar dit beantwoord niet helemaal mijn vragen:
php en image caching
Wat ik dus nu doe is netjes een 304 sturen als ik de if-modified-since krijg (maar die krijg ik volgens mij nooit)
verder heb ik een last modified en expires date opgegeven. Mijn last modified komt ook uit de DB, en die is dus elke keer hetzelfde, en ligt in het verleden.
De expires ligt in de toekomst.
Toch blijft mijn firefox requests naar de server sturen, en haalt niks uit de cache...
wat doe ik fout?
gooit die pragma header roet in het eten? die komt uit firefox.. waarom staat daar no-cache?
This message was sent on 100% recyclable electrons.