wake-up-neo.net

Verhindern der Zwischenspeicherung von iFrames im Browser

Wie verhindern Sie, dass Firefox und Safari Iframe-Inhalte zwischenspeichern?

Ich habe eine einfache Webseite mit einem iframe zu einer Seite auf einer anderen Site. Sowohl die äußere als auch die innere Seite haben HTTP-Antwortheader, um das Zwischenspeichern zu verhindern. Wenn ich im Browser auf die Schaltfläche "Zurück" klicke, funktioniert die Außenseite ordnungsgemäß, aber der Browser ruft immer einen Cache der iframed-Seite ab. IE funktioniert gut, aber Firefox und Safari machen mir Probleme.

Meine Webseite sieht ungefähr so ​​aus:

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

Die Variable var ändert sich immer. Trotz der Tatsache, dass sich die URL des Iframes geändert hat (und daher sollte der Browser eine neue Anforderung an diese Seite stellen), ruft der Browser nur den zwischengespeicherten Inhalt ab.

Ich habe die HTTP-Anforderungen und Antworten geprüft, die hin und her gehen, und ich habe festgestellt, dass der Browser auch dann <iframe src="webpage2.html?var=222" /> abruft, wenn die äußere Seite webpage2.html?var=111 enthält.

Folgendes habe ich bisher ausprobiert:

  • Ändern der iframe-URL mit einem zufälligen var-Wert
  • Hinzufügen von Expires-, Cache-Control- und Pragma-Headern zur äußeren Webseite
  • Hinzufügen von Expires-, Cache-Control- und Pragma-Headern zur inneren Webseite

Ich kann keine JavaScript-Tricks ausführen, da ich durch die Richtlinie "Same-Origin" blockiert bin. 

Mir gehen die Ideen aus. Weiß jemand, wie man den Browser daran hindert, den iframed-Inhalt zu cachen?

Aktualisieren

Ich habe Fiddler2 installiert, als Daniel vorgeschlagen hatte, einen weiteren Test durchzuführen, und leider bekomme ich immer noch die gleichen Ergebnisse.

Dies ist der Test, den ich durchgeführt habe:

  1. Die äußere Seite generiert mit Math.random() in JSP eine Zufallszahl.
  2. Äußere Seite zeigt Zufallszahlen auf der Webseite.
  3. Die Außenseite ruft iframe an und übergibt die Zufallszahl.
  4. Innenseite zeigt Zufallszahl.

Mit diesem Test kann ich genau sehen, welche Seiten aktualisiert werden und welche Seiten zwischengespeichert werden.

Visueller Test

Für einen schnellen Test lade ich die Seite, navigiere zu einer anderen Seite und drücke "Zurück". Hier sind die Ergebnisse:

Originalseite:

  • Außenseite: 0.21300034290246206
  • Innenseite: 0.21300034290246206

Seite verlassen, dann zurückschlagen:

  • Außenseite: 0.4470929019483644
  • Innenseite: 0.21300034290246206

Dies zeigt, dass die innere Seite zwischengespeichert wird, obwohl die äußere Seite sie mit einem anderen GET-Parameter in der URL aufruft. Aus irgendeinem Grund ignoriert der Browser die Tatsache, dass der iframe eine neue URL anfordert. es lädt einfach die alte.

Fiedlertest

Sicher, Fiddler bestätigt dasselbe.

(Ich lade die Seite.)

Äußere Seite wird aufgerufen. HTML:

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

http: //ipv4.fiddler: 1416/page1.aspx? var = 0.21300034290246206 wird aufgerufen.

(Ich navigiere von der Seite weg und tippe dann zurück.)

Äußere Seite wird aufgerufen. HTML:

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

http: //ipv4.fiddler: 1416/page1.aspx? var = 0.21300034290246206 wird aufgerufen.

Nun, bei diesem Test sieht es so aus, als würde der Webbrowser die Seite nicht zwischenspeichern, sondern die URL des Iframes zwischenspeichern und dann eine neue Anforderung an diese zwischengespeicherte URL stellen. Ich bin jedoch immer noch über die Lösung dieses Problems verblüfft.

Hat jemand eine Idee, wie Sie verhindern können, dass der Webbrowser iframe-URLs zwischenspeichert?

76
JR.

Richten Sie die URL des Iframes auf eine Seite auf Ihrer Website, die als Proxy fungiert, um den tatsächlichen Inhalt des Iframes abzurufen und zurückzugeben. Jetzt sind Sie nicht mehr an die Origin-Richtlinie gebunden (EDIT: verhindert nicht das Iframe-Caching-Problem).

0
kmoser

Dies ist ein Fehler in Firefox:

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

Versuchen Sie diese Problemumgehung:

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

<script>
var _theframe = document.getElementById("theframe");
_theframe.contentWindow.location.href = _theframe.src;
</script>
46
Caleb

Ich konnte diesen Fehler umgehen, indem ich ein eindeutiges name-Attribut im iframe festlegte - aus irgendeinem Grund scheint dies den Cache zu sprengen. Sie können alle dynamischen Daten, die Sie haben, als name-Attribut verwenden - oder einfach die aktuelle ms- oder ns-Zeit in der von Ihnen verwendeten Templatesprache. Dies ist eine schönere Lösung als die oben genannten, da JS nicht direkt erforderlich ist.

In meinem speziellen Fall wird der Iframe über JS erstellt (aber Sie können dasselbe auch über PHP, Ruby oder was auch immer), also benutze ich einfach Date.now():

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

Dies behebt den Fehler in meinen Tests. wahrscheinlich, weil sich der window.name im inneren Fenster ändert.

27
STRML

Es ist ein Fehler in Firefox 3.5.

Schauen Sie doch mal nach .. https://bugzilla.mozilla.org/show_bug.cgi?id=279048

3
renga

Nachdem ich alles andere ausprobiert hatte (außer einen Proxy für den Iframe-Inhalt zu verwenden), fand ich eine Möglichkeit, das Zwischenspeichern von Iframe-Inhalten aus derselben Domäne zu verhindern:

Verwenden Sie .htaccess Und eine Umschreiberegel und ändern Sie das Attribut iframe src.

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

Ich benutze dies so, dass die URL des Iframes am Ende so aussieht: example.com/test/54/e3116491e90e05700880bf8b269a8cc7.html

Wobei [token] ein zufällig generierter Wert ist. Diese URL verhindert das Zwischenspeichern von Iframes, da das Token niemals identisch ist, und der Iframe denkt, dass es sich um eine völlig andere Webseite handelt, da bei einer einzelnen Aktualisierung eine völlig andere URL geladen wird:

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

beide führen zur selben Seite.

Sie können mit $_SERVER["QUERY_STRING"] auf Ihre versteckten URL-Parameter zugreifen

3
Jeff Noel

Wie Sie gesagt haben, ist das Problem hier nicht iframe content caching, sondern iframe url caching.

Ab September 2018 scheint es, dass das Problem immer noch in Chrome auftritt, nicht jedoch in Firefox.

Ich habe viele Dinge ausprobiert (Hinzufügen eines sich ändernden GET-Parameters, Löschen der iframe-URL in onbeforeunload, Erkennen eines "Neuladens aus dem Cache" mithilfe eines Cookies, Einrichten verschiedener Antwortheader).

1- Einfacher Weg: Erstellen Sie Ihren iFrame dynamisch aus Javascript.

Zum Beispiel:

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

2- gewundener Weg

Server-seitig, wie in hier beschrieben, deaktivieren Sie die Zwischenspeicherung von Inhalten für den Inhalt, den Sie für den iframe ODER für die übergeordnete Seite bereitstellen (dies ist der Fall).

UND

Legen Sie die iframe-URL von Javascript mit einem zusätzlichen, sich ändernden Suchparameter wie dem folgenden fest:

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

(vereinfachte Version, Vorsicht vor anderen Suchparametern)

3
steph643

Fügen Sie den aktuellen Unix-Zeitstempel am Ende der GET-Parameter hinzu, damit der iframe immer frischen Inhalt lädt. Der Browser sieht es dann als "andere" Anfrage und sucht nach neuen Inhalten.

In Javascript könnte es so aussehen:

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

Ich habe das iframe src-Attribut später in meiner App festgelegt. Um den zwischengespeicherten Inhalt in iframe zu Beginn der Anwendung zu entfernen, mache ich einfach:

myIframe.src = "";

... irgendwo am Anfang von js-Code (zum Beispiel in jquery $ () - Handler)

Vielen Dank an http://www.freshsupercool.com/2008/07/10/firefox-caching-iframe-data/

2
janekw

Ich habe dieses Problem sowohl im neuesten Chrome als auch im neuesten Safari unter Mac OS X vom 17. März 2016 gefunden. Keine der oben genannten Korrekturen funktionierte für mich, einschließlich der Zuweisung von src zum Leeren und dann Zurückkehren zu einer Site oder Hinzufügen ein zufällig benannter "name" -Parameter oder das Hinzufügen einer Zufallszahl am Ende der URL nach dem Hash oder das Zuweisen des Inhaltsfensters href zum src nach dem Zuweisen des src.

In meinem Fall lag es daran, dass ich zum Aktualisieren des IFRAME Javascript verwendet habe und nur den Hash in der URL wechsle.

In meinem Fall bestand die Problemumgehung darin, dass ich eine vorläufige URL mit einer 0-Sekunden-Meta-Weiterleitung zu dieser anderen Seite erstellt hatte. Es geschieht so schnell, dass ich den Bildschirmblitz kaum merke. Außerdem habe ich die Hintergrundfarbe der Zwischenseite so wie die andere Seite gemacht, so dass Sie es noch weniger bemerken.

2
Volomike

Ich hatte dieses Problem auch 2016 mit iOS Safari. Was für mich zu funktionieren schien, war Gab dem iframe src einen GET-Parameter und einen Wert dafür 

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

0