动态css的缓存头(通过PHP生成)

时间:2010-03-07 08:16:53

标签: php css dynamic caching header

我的CSS文件实际上是一个PHP文件,它与内容类型text/css一起提供,因此我可以在该文件中使用PHP变量。 style.php看起来像这样:

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

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

它按预期工作,但如果浏览器缓存动态创建的css文件,我有点担心。

在查看firebug中的请求时,我觉得每次重新加载页面时浏览器都会重新加载style.php

我已经尝试添加这些缓存标头:

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

但没有运气。每次加载页面时仍会加载该文件。为了强制浏览器将文件缓存一段时间,有哪些适当的标题?

2 个答案:

答案 0 :(得分:2)

如果您希望浏览器缓存文件,则应将Cache-control标头设置为public:

header('Cache-control: public');

必须重新验证意味着浏览器将检查文件是否已更新,这将调用您的PHP脚本。

答案 1 :(得分:1)

此代码可以解决您的问题。

检查“last modified”变量并为文件指定eTag。 如果修改了eTag(或修改了文件),则会显示该文件。否则,会出现304 HTTP错误,指出该页面未被修改。

eTag实际上就是你要找的东西。

代码:

<?php 
// Custom variables
$variables = array('#CCC','#800'); // from db

// CSS Content
header('Content-type: text/css');

// Last Modified
$lastModified = filemtime(__FILE__);

// Get a unique hash of this file (etag)
$etagFile = md5_file(__FILE__);

// Get the HTTP_IF_MODIFIED_SINCE header if set
$ifModifiedSince = (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false);

// Get the HTTP_IF_NONE_MATCH header if set (etag: unique file hash)
$etagHeader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false);

// Set last-modified header
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lastModified)." GMT");

// Set etag-header
header("Etag: $etagFile");

// Make sure caching is turned on
header('Cache-Control: public');

// Check if page has changed. If not, send 304 and exit
if(@strtotime($ifModifiedSince) == $lastModified || $etagHeader == $etagFile){
   header("HTTP/1.1 304 Not Modified");
   exit;
}
?>
body {background: <?php echo $variables[0]; ?>;}