无论你做什么,都要小心客户端的缓存:
浏览器会使用各种技巧来尝试最小化带宽,并且 HTTP 协议中有很多方法可以做到这一点,所有这些都由 apache 处理 - 如果您只是提供本地文件。
如果你不是,那么这是你的责任。
至少看一下当前所有浏览器都支持的 ETag 和 If-Modified-Since 机制,它们似乎是向服务器查询更新内容的最可靠方法。
使用 If-Modified-Since-Header 将 CSS 文件提供给浏览器的一种可能方式是这样的(空头以关闭 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-Header。客户端将使用 If-None-Match 标头将其发回,从而使服务器不仅可以决定上次修改的日期,还可以决定内容本身。
这只是让代码更复杂,所以我把它省略了。 FF、IE 和 Opera(也可能是 Safari)在接收到附加了 Last-Modified 标头的内容时都会发送 If-Modified-Since 标头,因此可以正常工作。
另外请记住,某些版本的 IE(或它使用的 JScript-Runtime)仍然在 GZIP 传输的内容方面存在问题。
哦。我知道这不是问题的一部分,但 Acrobat 在某些版本中也是如此。在使用 gzip 传输编码提供 PDF 时,我遇到过白屏的案例。