views:

224

answers:

1

My CSS file is acutally a PHP file which is served with content-type text/css so that I can use PHP variables in that file. style.php looks like this:

<?php
header('Content-Type: text/css');
$bgColor = '#000';
?>

body { background:<?php print $bgColor; ?>; }

It works as expected, but I am a bit worried if the browser caches the dynamically created css file.

When looking at the requests in firebug, it seems to me that the browser is loading style.php anew everytime I reload the page.

I already tried to add these cache headers:

header('Cache-control: must-revalidate');
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 60 * 60 * 24) . ' GMT');

But no luck. The file is still loaded everytime the page is loaded. What are the appropriate headers in order to force the browser to cache the file for a certain amount of time?

+1  A: 

If you want a file to be cached by browsers, you should set the Cache-control header to public:

header('Cache-control: public');

must-revalidate means that the browser will check to see if the file has been updated, which will invoke your PHP script.

Inspire
According to the HTTP/1.1 spec, that's not what must-validate is supposed to mean — it's only supposed to kick in after the cached content has become stale (as directed by the Expires header, or a max-age value within Cache-Control), but some browsers do seem to ignore the spec and send the request anyway. 'public' isn't really applicable, though, unless the connection is authenticated. I would use 'Cache-Control: max-age=86400' to reinforce the time in the Expires header.
Brock Batsell
@Brock Batsell: thanks for the comment! That clarified it and it works now with max-age=XXXX
Max