web-dev-qa-db-ja.com

私のHTML5アプリケーションキャッシュマニフェストはすべてをキャッシュしています

更新:

**この機能が本当に新しいときにこの質問を投稿しましたが、JavaScriptを介して使用しない限り、この機能をこのように使用しないでください。しかし、このハックは、この機能の同じ間違いや誤用をするほとんどの初心者にとって素晴らしい解決策のようです。 HTML以外のすべてをキャッシュする場合は、JSを使用するか、以下のソリューションを使用できます**

私の質問はこれに要約されると思います。HTMLタグのマニフェスト属性を使用してマニフェストを参照するファイルがMASTERCACHE ENTRIESに該当する場合、動的ページでマニフェストを使用するにはどうすればよいでしょうか。

私のファイルは次のようになります。

CACHE MANIFEST

CACHE:
# IMAGES:
/stylesheets/bg.jpg
/stylesheets/cont_bg.png
#and so forth.. 

#EXTERNAL
http://chat.mydomain.com/themes/images/panel_bg.png
http://chat.mydomain.com/themes/images/images_core.png

####################################
#STYLE SHEETS:
/stylesheets/min.css
/stylesheets/css_night.aspx

#####################################
#JAVASCRIPT:
/JAVASCRIPT/header_javascript.js

#EXTERNAL:
http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js
http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js

FALLBACK:
/ /offline.php

NETWORK:
*

ここで問題となるのは、マニフェストにないページを参照すると、index.phpのような実際の動的phpファイルが最初に表示され、キャッシュがない場合chrome

Adding master entry to Application Cache with manifest http://208.109.248.197/manifest.appcache

Application Cache Downloading event
Application Cache Progress event (0 of 28) 
...
Application Cache Progress event (28 of 28) 
Application Cache NoUpdate event

私が実際にページをロードするまではこれまでのところ良好で、chromeは次のようになります:

Application Cache UpdateReady event
Adding master entry to Application Cache with manifest http://mydomain.com/manifest.appcache

最後の行でわかるように、index.phpがアプリケーションキャッシュに追加され、URLに移動してこれを確認しました:chrome://appcache-internals/

それは言う:

Flags   URL Size (headers and data)
Explicit,   http://mydomain/JAVASCRIPT/header_javascript.js 57.5 kB
Master, http://mydomain/home.php 51.2 kB
Master, http://mydomain/index.php   53.5 kB
Master, Fallback,   http://mydomain/offline.php 49.4 kB

index.phpやhome.phpなどはキャッシュされないはずです。可能であれば、html拡張子をキャッシュしないように伝えたいと思います。しかし、これが私が信じるさまざまなRFCから学んだことです。オープンまたはブロックのいずれかであるオンラインホワイトリストワイルドカードフラグ。

The open state indicates that any URL not listed as cached is to be implicitly treated as being in the online whitelist namespaces; the blocking state indicates that URLs not listed explicitly in the manifest are to be treated as unavailable.

これらのオンラインホワイトリストワイルドカードフラグの1つを使用して、ブロックに設定したいのですが、これ以上の説明や例は見つかりません。私も読んだ:

zero or more URLs that form the online whitelist namespaces.

These are used as prefix match patterns, and declare URLs for which the user agent will ignore the application cache, instead fetching them normally (i.e. from the network or locale HTTP cache as appropriate).

このようなパターンも使用したいのですが、ドキュメントが見つかりません。私のchrome appcacheディレクトリには何も表示されない!?!?

お時間をいただきありがとうございます!

23
Neo

これが私が遊んで見つけたハックです:

私は最終的な答えを見つけていませんが、私が学んだことから、マニフェストはすべてのページに設定されることを意図していないようです。繰り返しますが、よくわかりませんが、これは私が遭遇したハックです。マニフェスト.htmlのようなページがあります。

<html manifest="manifest.appcache"> 

これがないページはキャッシュに追加されませんが、同じドメインにある場合は引き続きアプリケーションキャッシュを使用することを学びました。したがって、manifest.htmlをすべてのページのiframeにこれを含むプレーンなhtmlページを含めると、chromeは出力されなくなります:

Adding master entry to Application Cache with manifest 

ただし、[ネットワーク]タブに移動すると、キャッシュを使用していることがわかります。

<iframe id='manifest_iframe_hack' 
  style='display: none;' 
  src='temporary_manifest_hack.html'>
</iframe> 

temporary_manifest_hack.htmlのコンテンツ:

<!DOCTYPE HTML>
<html lang="en" class="no-js" manifest="manifest.appcache">
    <head>
        <meta charset="utf-8">
        <title>Hack 4 Manifest</title>
    </head>
    <body></body>
</html>
26
Neo

Appcacheには、htmlタグにmanifest属性を含むページが常に含まれています。

そのページ自体を動的にしたい場合は、NETWORKセクションにあるサービスへのajax呼び出しを使用してコンテンツをページにロードする必要があります。

10
Joeri Sebrechts

Iframeの回避策は機能しないと思います。ファイルがappcacheから削除されたと思われる場合:いいえ。それらはブラウザのキャッシュから来ています。

devtools-settingsでbrowsercacheを無効にし、「ネットワーク」を確認します。すべての要素がネットワーク経由で読み込まれ、(アプリ)キャッシュから取得されないことがわかります。

3
EscapeNetscape