2017-07-07 102 views
0

我有一個應用程序正在使用AppCache將資源存儲在瀏覽器的緩存中。我已經能夠在PHP文件上設置清單,以便自動寫入所有必須緩存(正確過濾)的文件。此文件的標題如下:HTML5 - ApplicationCache不更新(僅)某些文件

header('Content-Type: text/cache-manifest'); 
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); 

這就是所謂的appcache.php和它在我的HTML正確引用:

<html manifest="appcache.php"> 

每次我更新清單,應用程序檢測更新和事件被正確觸發,更新緩存並刷新頁面以便重新加載。

但是,某些文件(主要是Javascript和CSS文件)沒有正確刷新。有時需要幾個清單更新(與整個過程),有時它只需要一個,有時它需要永遠,我必須刪除瀏覽器緩存或去隱身模式

該應用程序檢測到更新,所以清單沒有得到捕獲,它得到正確更新。問題是,即使文件被再次下載,它們仍舊在舊版本中服務。主要問題是,這隻發生在一些文件中(有時它們是一些css文件,有時它們是js,依此類推:未更新的文件是隨機的)。

實際上,我使用的是Chrome v59,在我的Android設備上使用Chrome v60發生的情況也是如此。

有沒有任何解釋爲什麼他們不刷新正確?這是一個已知的錯誤?我能做些什麼來解決它?

UPDATE

看來,它發生的最當我已經做了一些與他們之間很短的時間更新。等待24小時左右後,它會在第一次嘗試中起作用。也許這可以幫助你猜出爲什麼會發生。

謝謝。

回答

0

這可能是你的清單文件得到緩存,可以設置Expires頭爲它rightaway到期

我建議增加swapCache方法

$(function() {  
if (window.applicationCache) { 
     applicationCache.addEventListener('updateready', function() {   
    if (window.applicationCache.status == 
     window.applicationCache.UPDATEREADY) { 
     window.applicationCache.swapCache(); 
     console.log("appcache updated"); 
     window.location.reload(); 
     } 
    }); 
    } 
    } 

其他的事情,要強制所有新(或更改)文件下載,您必須 更新清單文件(這似乎是你正在做它)。

最常見的一種情況是,您可能沒有使用正確的MIME類型(文本/緩存清單)來提供清單。

您可能會收到錯誤,檢查錯誤的最簡單方法是在Chrome中打開頁面,然後查看AppCache下的控制檯和資源選項卡,查看是否有錯誤(它會報告提供的文件。最多不正確你也可以使用curl -I命令測試一下:

curl -I $manifest_file_URL 
+0

它正確地做的全過程,並清單被更新(或事件將不會被觸發)沒有錯誤,也不。而且它沒有得到擦肩而過,因爲應用程序檢測到它已經改變了。問題是,一些文件的更新,而其他(主要是js和css)沒有。 – Unapedra