你做什么都,要小心在客户端缓存:
浏览器完成所有类型的招数,试图尽量减少带宽和有在HTTP协议中许多方法可以做到这一点,所有的由apache处理 - 如果你只是提供本地文件。
如果您不是,那么这是您的责任。
看看至少在所有当前浏览器支持的ETag和If-Modified-Since机制,似乎是查询服务器更新内容的最可靠方法。
一种可能的方式来服务于一个CSS文件,使用浏览器IF-Modified-Since的标头是这样的(空的头关闭任何非缓存头的PHP将每默认):
$p = 'path/to/css/file'
$i = stat($p);
if ($_SERVER['HTTP_IF_MODIFIED_SINCE']){
$imd = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
if (($imd > 0) && ($imd >= $i['mtime'])){
header('HTTP/1.0 304 Not Modified');
header('Expires:');
header('Cache-Control:');
header('Last-Modified: '.date('r', $i['mtime']));
exit;
}
}
header('Last-Modified: '.date('r', $i['mtime']));
header('Content-Type: text/css');
header('Content-Length: '.filesize($p));
header('Cache-Control:');
header('Pragma:');
header('Expires:');
readfile($p);
代码将使用浏览器发送的if-modified-since-header来检查服务器上的实际文件自浏览器发出日期以来是否发生了更改。如果是,则发送该文件,否则,将返回304 Not Modified,并且浏览器不必重新下载整个内容(如果足够智能,它也会将解析的CSS保存在内存中)。
还有一种机制涉及服务器为每个内容发送一个唯一的ETag标题。客户端将使用If-None-Match标头发回,以便服务器不仅可以决定上次修改的日期,还可以决定内容本身。
虽然这只是使代码更复杂,所以我已经将它遗漏了。 FF,IE和Opera(可能也是Safari)都会在接收到带有Last-Modified标头的内容时发送If-Modified-Since标头,所以这可以正常工作。
也请记住,某些版本的IE(或其使用的JScript-Runtime)仍然在使用GZIP传输的内容时遇到问题。
哦。我知道这不是问题的一部分,但Acrobat在某些版本中也是如此。使用gzip传输编码提供PDF时,我遇到了白屏案例和案例。
只是好奇 - 为什么主机公司禁用mod_deflate和mod_gzip ?!其实它*他们*的兴趣,让他们打开! – scunliffe 2010-11-05 10:38:16