2012-07-05 60 views
2

我需要瀏覽器緩存一個大的,大多數是靜態的.php文件。我通過ajax打開它,並希望將其添加到當前頁面。強制瀏覽器緩存一個.php文件

經過研究後,若發現this

$seconds_to_cache = 3600; 
$ts = gmdate("D, d M Y H:i:s", time() + $seconds_to_cache) . " GMT"; 
header("Expires: $ts"); 
header("Pragma: cache"); 
header("Cache-Control: max-age=$seconds_to_cache"); 

這適用於IE瀏覽器,而不是Chrome和Firefox。

這裏是請求

Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding gzip, deflate 
Accept-Language de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 
Cache-Control max-age=0 
Connection keep-alive 
Content-Type application/x-www-form-urlencoded 
Cookie PHPSESSID=5dkvr42f4it8pnnnqpesj6l413 
Host localhost 
Referer http://localhost/mifa/Suche.php 
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1 
charset utf-8 

這裏的響應頭

Cache-Control max-age=3600 
Connection Keep-Alive 
Content-Type text/html 
Date Thu, 05 Jul 2012 15:28:22 GMT 
Expires Thu, 05 Jul 2012 16:28:22 GMT 
Keep-Alive timeout=5, max=91 
Pragma cache 
Server Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1 
Transfer-Encoding chunked 
X-Powered-By PHP/5.3.8 

我需要改變什麼?

EDIT

顯然,只有IE不緩存控制最大年齡= 0附加到該請求。

這裏是請求的JS功能

url = "includes/Orte.php"; 
obj.onreadystatechange = rState; 
obj.open("GET", url, true); 
obj.setRequestHeader("Pragma", ""); 
obj.setRequestHeader("Cache-Control", ""); 
obj.setRequestHeader("charset", "utf-8"); 
obj.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
obj.setRequestHeader("Connection", "close"); 
obj.send(); 

function rState(){ 
    if(obj.readyState == 4){ 
     if (obj.status == 200){ 
      //alert("Response Text Ajax:\n" + obj.responseText + "\nEnd Response Text"); 
     } 
    } 
} 
+0

您可以通過在第二個隨後的請求中發送一個HTTP 304 Not modified來實現,以確保瀏覽器不再詢問。儘管設置了正確的緩存日期/時間等,但我相信某些瀏覽器會再次請求文件。 – fdomig 2012-07-05 15:35:01

回答

2

請求中的Cache-Control: max-age=0頭信息意味着你問你的瀏覽器中刷新頁面,所以他只是忽略緩存。

訪問不刷新頁面(例如,集中地址欄和回車)來避免這種情況。另外,如果頁面位於HTTPS URL上,則可能必須將public添加到Cache-Control標頭,否則某些瀏覽器將不會緩存它。

+0

你說得對,只有IE不會追加max-age = 0。 我該如何解決這個問題?我發佈了上面的JS代碼。你知道ff和chrome插入哪個頭部? – ellow7 2012-07-05 16:10:20

0

兩件事情浮現在腦海中的最後一次修改的頭,並使用的.htaccess緩存控制。後者適用於廣泛的類型,但您可以僅將它用於一個文件夾,並將該文件單獨存放在一個文件夾中。

header("Last-Modified: ... "); 
+0

「Last-Modified」會觸發瀏覽器在其下一個請求中發送「If-Modified-Since」;腳本將不得不解析並可能以'304 Not Modified'狀態回覆。這將阻止瀏覽器下載整個內容,但不會執行請求。 – arnaud576875 2012-07-05 15:47:11