ブラウザでのiframeキャッシュの防止


86

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

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

  • ランダムなvar値でiframeURLを変更する
  • Expires、Cache-Control、およびPragmaヘッダーを外部Webページに追加する
  • Expires、Cache-Control、およびPragmaヘッダーを内部Webページに追加する

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

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

更新

ダニエルが別のテストを実行するように提案したので、Fiddler2をインストールしましたが、残念ながら、それでも同じ結果が得られます。

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

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

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

ビジュアルテスト

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

元のページ:

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

ページを離れて、反撃する:

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

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

フィドラーテスト

案の定、フィドラーは同じことを確認しています。

(ページをロードします。)

外側のページが呼び出されます。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ブラウザがiframeURLをキャッシュしないようにする方法について誰かがアイデアを持っていますか?


11
+ 1-あなたの文章は痛みをとてもうまく捉えています。
nickf 2012年

1
問題の非常に詳細な説明をありがとう、これは私がサイトで経験していることとまったく同じです。7年が経ちましたがFirefoxのバグレポートはまだ存在しています。
Scuzzy 2017年

回答:


-3

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


41
これはキャッシュを妨げません。
baash05 2012

@ baash05私はそれがしたとは決して主張しませんでした。同一生成元ポリシーを回避すると言いました。
kmoser 2018年

1
本当です。しかし、opのタイトルは「ブラウザでのiframeキャッシュの防止」と書かれており、あなたの答えがブラウザでのiframeキャッシュを妨げないのであれば、それは実際には答えではありません。知っておくのは良いことですが、それでもキャッシュを防ぎたいと思っている人には良いアドバイスではありません。
baash05 2018

OPは、キャッシュを解決し、同一生成元ポリシー回避しようとしていました。部分的な答えは何もないよりはましです:)
kmoser 2018

2
トーストは常にジャム側を下にして落ちます:)
baash05 2018

58

これは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>

3
今日27.2.2014このスレッドを見つけてとてもうれしく思います。サーバー側のキャッシュなしで解決できると思いました。FF27にはまだこのバグがあります。
ロバート

7
7。8。2014-8年後、まだ修正されていません。
ルカシュZaroda

これはsrcdoc属性にも当てはまるので、奇妙です...とても素晴らしいです。
elundmark 2014年

2
Chromeでこれと同じキャッシュの問題が見つかり、JavaScriptの2行で解決しました。ありがとうございました!
とげ2014

2
うわー、まったく同じ問題がありました。Firefoxに固有でした-IE、Chromeなどで正常に動作しました。@ calebに感謝します。これが長く続いているなんて信じられない。
ブードゥー2014

32

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

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

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

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


2
この回答は、2015
。– rovermicrover

13

あなたが言ったように、ここでの問題はiframeコンテンツのキャッシュではなく、iframeのURLキャッシュです。

2018年9月の時点で、この問題はChromeでも発生しているようですが、Firefoxでは発生していません。

私は多くのことを試しました(変更するGETパラメーターの追加、onbeforeunloadのiframe URLのクリア、Cookieを使用した「キャッシュからの再読み込み」の検出、さまざまな応答ヘッダーの設定)。これが私から機能した2つの解決策だけです。

1-簡単な方法:JavaScriptから動的にiframeを作成する

例えば:

const iframe = document.createElement('iframe')
iframe.id = ...
...
iframe.src = myIFrameUrl 
document.body.appendChild(iframe)

2-複雑な方法

サーバーサイドでは、ここで説明するように、iframeまたは親ページに提供するコンテンツのコンテンツキャッシュを無効にします(どちらでもかまいません)。

そして

次のように、追加の変更検索パラメータを使用して、javascriptからiframeURLを設定します。

const url = myIFrameUrl + '?timestamp=' + new Date().getTime()
document.getElementById('my-iframe-id').src = url

(簡略化されたバージョン、他の検索パラメーターに注意してください)


5

他のすべてを試した後(iframeコンテンツのプロキシを使用することを除く)、同じドメインからiframeコンテンツのキャッシュを防ぐ方法を見つけました:

使用.htaccessして書き換えルールとiframeの変更src属性を。

RewriteRule test/([0-9]+)/([a-zA-Z0-9]+).html$ /test/index.php?idEntity=$1&token=$2 [QSA]

私がこれを使用する方法は、iframeのURLが次のように見えることです。 example.com/test/54/e3116491e90e05700880bf8b269a8cc7.html

ここで、[token]はランダムに生成された値です。このURLは、トークンが同じになることはないため、iframeのキャッシュを防ぎます。また、1回の更新でまったく異なるURLが読み込まれるため、iframeはそれがまったく異なるウェブページであると見なします。

example.com/test/54/e3116491e90e05700880bf8b269a8cc7.html
example.com/test/54/d2cc21be7cdcb5a1f989272706de1913.html

どちらも同じページにつながります。

あなたはあなたの隠されたURLパラメータにアクセスすることができます $_SERVER["QUERY_STRING"]


1
私のために働いた-ありがとう!
クインフィニー

@QuinnFinneyうれしいこれは他の誰かに役立ちました。この問題を解決するのに数日かかりました:)
Jeff Noel

うん、私も!ハハハ
クインフィニー


3

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

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

frames['my_iframe'].location.href='load_iframe_content.php?group_ID=' + group_ID + '&timestamp=' + timestamp;

3

2016年3月17日の時点で、最新のChromeとMac OS Xの最新のSafariでこの問題が見つかりました。srcを空に割り当ててからサイトに戻す、追加するなど、上記の修正はいずれも機能しませんでした。ランダムに名前が付けられた「name」パラメータ、ハッシュの後のURLの末尾に乱数を追加する、またはsrcを割り当てた後にコンテンツウィンドウhrefをsrcに割り当てる。

私の場合、Javascriptを使用してIFRAMEを更新し、URLのハッシュのみを切り替えていたためです。

私の場合の回避策は、他のページへの0秒のメタリダイレクトを持つ暫定URLを作成することでした。それはとても速く起こるので、私は画面のフラッシュにほとんど気づきません。また、中間ページの背景色を他のページと同じにしたので、気づきにくくなっています。



0

2016年にiOSSafariでもこの問題が発生しました。私にとってはうまくいったように見えたのは、iframesrcにGETパラメータとその値をこのように与えることでした

<iframe width="60%" src="../other/url?cachebust=1" allowfullscreen></iframe>


-1

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

何が要求されているのか、何が返送されているのかなどを正確に確認できます。ブラウザが実際にさまざまなURLのキャッシュにアクセスする可能性はありません。


1
Fiddler2のヒントをありがとう。これで、ブラウザがiframeコンテンツをキャッシュしていないことがわかりました。iframeのURLをキャッシュするだけです。しかし、私はまだ困惑しており、ブラウザが新しいページのiframe URLを無視し、単に古いURLを使用する理由がわかりません。
JR。

-1

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

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


-2

キャッシュなしのさまざまなHTTPヘッダーオプションをiframeページに追加してみましたか?


うん。各ページのHTTPヘッダーとメタタグの両方でno-cacheディレクティブを試しました。
JR。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.