HTML5オフラインAppCacheの更新は、Firefoxに表示されません
-
26-10-2019 - |
質問
ドックルートにindex.phpファイルがあります。これで始まる出力を生成します。
<!DOCTYPE html>
<html manifest="manifest.appcache">
Manifest.appcacheは、ブラウザにオフラインで使用するためにキャッシュするように指示します。繰り返しますが、関連する部分:
CACHE MANIFEST
#version 8-25-2011
CACHE:
#internal HTML documents
#this tells the browser to cache the HTML it retrieves from http://example.com/
/
NETWORK:
*
このセットアップではオフラインアクセスが正常に動作していますが、Firefoxで予想されるように更新は機能していません。
ChromeとSafariでは、index.phpファイルを更新してからcache.manifestファイルでコメントを変更すると、ブラウザは新しいindex.php出力をつかみ、キャッシュでそれを使用します。
ただし、Firefoxでは、manifest.appcacheファイルを更新したことは気にしないようです。十分に長く待つと更新されるのではないかと思われますが、時間を待ってみました。
キャッシュの問題を見つけて排除するにはどうすればよいですか?
解決
index.phpファイルでどのHTTPキャッシュヘッダーを送信していますか?のようなものを設定していない場合 Cache-control:
と Expires:
ヘッダーは、Firefoxがサーバーから再度リクエストする代わりに、通常のキャッシュからページのアプリケーションキャッシュバージョンを更新する可能性があります。
質問のポスターによる編集:
それが正確に何をしたかを知りたい人のために、この答えとの閲覧に基づいて、私の.htaccessファイルに入れたものはここにあります http://www.diveintohtml5.info/offline.html:
<Files *.appcache>
ExpiresActive On
ExpiresDefault "access"
</Files>
それが次の人を助けることを願っています!
他のヒント
私はパーティーに本当に遅れていることを知っていますが、私は何年もの間Firefoxでこの問題を見てきており、根底にあるバグが修正されることを望んでいました。
残念ながらそれは起こりませんでしたが、私はついに回避策を思いつきました。私の場合、新しい.AppCacheファイルがロードされ、処理されますが、ページリロードは新しくキャッシュされたバージョンを使用しません。私が使用しているプロセスは次のとおりです。
- index.htmlはロードされ、HTMLタグの.appcacheファイルを指定します。
- .AppCacheファイルは、PHPスクリプトを使用して動的に生成されます。スクリプトにはすべて、マニフェストに含まれる一意のバージョンハッシュを作成するためのファイルが含まれています。これは、マニフェストに記載されているファイルがキャッシュリロードを強制するファイルの変更を意味します。
私の.htaccessファイルには、.appcacheマニフェストがキャッシュされるのを防ぐために、次のようなものがあります。
<Files *.appcache> ExpiresActive On ExpiresDefault "access plus 0 seconds" </Files>
私のJavaScriptコードは、更新されたファイルが取得されたら、AppCacheの更新を検出し、ページをリロードします。
appCache.addEventListener('updateready', function(e) { console.log("Appcache update finished, reloading..."); setLoadingBar(100, "Loading..."); appCache.swapCache(); location.reload(); });
ページがリロードされると、キャッシュがユーザーによって手動でクリアされるまで、古いキャッシュがFirefoxで使用されます。私がテストした他のすべてのブラウザでは、新しくキャッシュされたファイルが即座に影響を与えます。
修正は痛々しいほどシンプルであることが判明しました!
必要だったのは、を変更することだけでした location.reload()
真のパラメーターを含める行:
location.reload(true)
これは、AppCacheのファイルが新しい場合でも、AppCacheが保存されたファイルを使用するのではなく、Firefoxが通常のキャッシュからファイルを提供することを示しているようです。これは、FirefoxがAppcacheの前に通常のキャッシュメカニズムを置くからだと思います。
リクエスト - >通常のキャッシュ - > appcache->ネットワークリクエスト
しかし、それは単なる推測です。