你做什麼都,要小心在客戶端緩存:
瀏覽器完成所有類型的招數,試圖儘量減少帶寬和有在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