97

Firefox と Safari が iframe コンテンツをキャッシュしないようにするにはどうすればよいですか?

別のサイトのページへの iframe を持つ単純な Web ページがあります。外側のページと内側のページの両方に、キャッシュを防止するための HTTP 応答ヘッダーがあります。ブラウザーの「戻る」ボタンをクリックすると、外側のページは正常に機能しますが、ブラウザーは常に iframe ページのキャッシュを取得します。IE は問題なく動作しますが、Firefox と Safari では問題が発生します。

私のウェブページは次のようになります。

<html>
  <head><!-- stuff --></head>
<body>
  <!-- stuff -->
  <iframe src="webpage2.html?var=xxx" />
  <!-- stuff -->
</body>
</html>

変数はvar常に変化します。iframe の URL は変更されていますが (したがって、ブラウザーはそのページに対して新しい要求を行う必要があります)、ブラウザーはキャッシュされたコンテンツをフェッチするだけです。

行き来する HTTP リクエストとレスポンスを調べたところ、外側のページに が含まれていても<iframe src="webpage2.html?var=222" />、ブラウザは をフェッチすることに気付きましたwebpage2.html?var=111

これが私がこれまでに試したことです:

  • ランダム変数値で iframe URL を変更する
  • Expires、Cache-Control、Pragma ヘッダーを外側の Web ページに追加する
  • Expires、Cache-Control、Pragma ヘッダーを内部 Web ページに追加する

同一生成元ポリシーによってブロックされているため、JavaScript トリックを行うことができません。

私はアイデアが不足しています。ブラウザーが iframe コンテンツをキャッシュしないようにする方法を知っている人はいますか?

アップデート

Daniel が別のテストを実行するよう提案したので、Fiddler2 をインストールしましたが、残念ながら、まだ同じ結果が得られています。

これは私が行ったテストです:

  1. Math.random()外側のページは、JSP で使用して乱数を生成します。
  2. 外部ページはウェブページ上に乱数を表示します。
  3. 外部ページは iframe を呼び出し、乱数を渡します。
  4. 内部ページには乱数が表示されます。

このテストでは、どのページが更新され、どのページがキャッシュされているかを正確に確認できます。

ビジュアルテスト

簡単なテストとして、ページを読み込んで別のページに移動し、[戻る] を押します。結果は次のとおりです。

元のページ:

  • 外のページ: 0.21300034290246206
  • 内部ページ: 0.21300034290246206

ページを離れてから、次のように打ち返します。

  • 外側のページ: 0.4470929019483644
  • 内部ページ: 0.21300034290246206

これは、外側のページが URL で別の GET パラメータを使用して呼び出しているにもかかわらず、内側のページがキャッシュされていることを示しています。何らかの理由で、ブラウザーは iframe が新しい URL を要求しているという事実を無視しています。古いものをロードするだけです。

フィドラーテスト

案の定、Fiddler も同じことを確認しています。

(ページを読み込みます。)

外部ページが呼び出されます。HTML:

0.21300034290246206
<iframe src="http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206" />

http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206が呼び出されます。

(私はページから離れてから、元に戻ります。)

外部ページが呼び出されます。HTML:

0.4470929019483644
<iframe src="http://ipv4.fiddler:1416/page1.aspx?var=0.4470929019483644" />

http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206が呼び出されます。

このテストから、Web ブラウザーはページをキャッシュしていないように見えますが、iframe の URL をキャッシュし、そのキャッシュされた URL で新しい要求を作成しています。ただし、この問題を解決する方法についてはまだ困惑しています。

Web ブラウザが iframe URL をキャッシュしないようにする方法について、何か考えがある人はいますか?

4

13 に答える 13

67

これは Firefox のバグです:

https://bugzilla.mozilla.org/show_bug.cgi?id=356558

この回避策を試してください:

<iframe src="webpage2.html?var=xxx" id="theframe"></iframe>

<script>
var _theframe = document.getElementById("theframe");
_theframe.contentWindow.location.href = _theframe.src;
</script>
于 2010-10-21T03:30:10.733 に答える
43

iframe に一意の属性を設定することで、このバグを回避することができましたname。何らかの理由で、これはキャッシュを破壊するようです。属性として持っている動的データは何でも使用できますname。または、使用しているテンプレート言語の現在の ms または ns 時間を単純に使用できます。これは、JS を直接必要としないため、上記よりも優れたソリューションです。

私の特定のケースでは、iframe は JS を介して構築されているため (ただし、PHP、Ruby などを介して同じことを行うことができます)、単純に次のように使用しますDate.now()

return '<iframe src="' + src + '" name="' + Date.now() + '" />';

これにより、私のテストでのバグが修正されました。おそらくwindow.name、内側のウィンドウの が変化するためです。

于 2014-10-04T08:47:29.330 に答える
3

これはFirefox3.5のバグです。

ご覧ください..https ://bugzilla.mozilla.org/show_bug.cgi?id = 279048

于 2011-03-23T06:03:10.263 に答える
3

iframe が常に新しいコンテンツをロードするようにするには、現在の Unix タイムスタンプを GET パラメータの末尾に追加します。ブラウザはそれを「別の」リクエストと見なし、新しいコンテンツを探します。

Javascript では、次のようになります。

frames['my_iframe'].location.href='load_iframe_content.php?group_ID=' + group_ID + '&timestamp=' + timestamp;
于 2014-05-12T21:36:50.833 に答える
2

アプリで後で iframe src 属性を設定します。アプリケーションの開始時に iframe 内のキャッシュされたコンテンツを取り除くには、次のようにします。

myIframe.src = "";

... js コードの先頭のどこか (たとえば、jquery $() ハンドラ内)

http://www.freshsupercool.com/2008/07/10/firefox-caching-iframe-data/に感謝し ます

于 2012-04-18T09:10:48.450 に答える
-1

本当に夢中になりたい場合は、クエリ文字列オプションではなく、常に同じページに解決される動的 URL としてページ名を実装できますか?

オフィスにいると仮定して、ネットワーク レベルでキャッシュが行われているかどうかを確認します。私を信じてください、それは可能性です。IT 担当者は、HTTP キャッシュに関するネットワーク インフラストラクチャがあるかどうかを教えてくれますが、これは iframe でのみ発生するため、可能性は低いです。

于 2010-10-07T10:43:03.313 に答える
-2

Fiddler2をインストールしましたか?

リクエストされているもの、送り返されているものなどを正確に確認できます。ブラウザがさまざまな URL のキャッシュに実際にヒットするというのは、もっともらしいとは思えません。

于 2010-04-15T18:43:00.487 に答える
-4

iframe の URL が、iframe の実際のコンテンツを取得して返すプロキシとして機能するサイト上のページを指すようにします。これで、同一生成元ポリシーに拘束されなくなりました (編集: iframe キャッシュの問題は防止されません)。

于 2010-06-29T16:50:00.417 に答える