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 verfügen über HTTP-Antwortheader, um das Caching zu verhindern. Wenn ich im Browser auf die Schaltfläche "Zurück" klicke, funktioniert die äußere Seite ordnungsgemäß, aber egal was passiert, 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 var
Variable ändert sich immer. Trotz der Tatsache, dass sich die URL des Iframes geändert hat (und der Browser daher eine neue Anfrage an diese Seite stellen sollte), ruft der Browser nur den zwischengespeicherten Inhalt ab.
Ich habe die hin und her gehenden HTTP-Anforderungen und -Antworten untersucht und festgestellt, dass <iframe src="webpage2.html?var=222" />
der Browser auch dann abruft, wenn die äußere Seite enthält webpage2.html?var=111
.
Folgendes habe ich bisher versucht:
- Ändern der iframe-URL mit zufälligem 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 von derselben Richtlinie blockiert werde.
Mir gehen die Ideen aus. Weiß jemand, wie man den Browser daran hindert, den iframed-Inhalt zwischenzuspeichern?
Aktualisieren
Ich habe Fiddler2 installiert, als Daniel vorgeschlagen hat, einen weiteren Test durchzuführen, und leider erhalte ich immer noch die gleichen Ergebnisse.
Dies ist der Test, den ich durchgeführt habe:
- Die äußere Seite generiert eine Zufallszahl
Math.random()
in JSP. - Die äußere Seite zeigt eine Zufallszahl auf der Webseite an.
- Die äußere Seite ruft iframe auf und übergibt eine Zufallszahl.
- Auf der Innenseite wird eine Zufallszahl angezeigt.
Mit diesem Test kann ich genau sehen, welche Seiten aktualisiert und welche Seiten zwischengespeichert werden.
Visueller Test
Für einen schnellen Test lade ich die Seite, navigiere zu einer anderen Seite und drücke dann "Zurück". Hier sind die Ergebnisse:
Originalseite:
- Äußere Seite: 0.21300034290246206
- Innere Seite: 0.21300034290246206
Seite verlassen, dann zurückschlagen:
- Äußere Seite: 0.4470929019483644
- Innere Seite: 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 den alten.
Geigen-Test
Sicher genug, bestätigt Fiddler dasselbe.
(Ich lade die Seite.)
Die ä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 drücke dann zurück.)
Die ä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.
Aus diesem Test geht hervor, dass der Webbrowser die Seite nicht zwischenspeichert, sondern die URL des Iframes zwischenspeichert und dann eine neue Anforderung für diese zwischengespeicherte URL stellt. Ich bin jedoch immer noch ratlos, wie ich dieses Problem lösen kann.
Hat jemand Ideen, wie der Webbrowser daran gehindert werden kann, Iframe-URLs zwischenzuspeichern?
Antworten:
Stellen Sie sicher, dass die URL des Iframes auf eine Seite auf Ihrer Site verweist, die als Proxy zum Abrufen und Zurückgeben des tatsächlichen Inhalts des Iframes fungiert. Jetzt sind Sie nicht mehr an die Richtlinie mit demselben Ursprung gebunden (BEARBEITEN: Verhindert das Problem des Iframe-Caching nicht).
quelle
Dies ist ein Fehler in Firefox:
https://bugzilla.mozilla.org/show_bug.cgi?id=356558
Versuchen Sie diese Problemumgehung:
quelle
Ich konnte diesen Fehler umgehen, indem ich ein eindeutiges
name
Attribut für den Iframe festlegte - aus irgendeinem Grund scheint dies den Cache zu sprengen. Sie können alle dynamischen Daten verwenden, die Sie alsname
Attribut haben - oder einfach die aktuelle ms- oder ns-Zeit in der von Ihnen verwendeten Vorlagensprache. Dies ist eine schönere Lösung als die oben genannten, da JS nicht direkt benötigt wird.In meinem speziellen Fall wird der Iframe über JS erstellt (aber Sie können dasselbe auch über PHP, Ruby usw. tun), also verwende ich einfach
Date.now()
:Dies behebt den Fehler in meinen Tests; wahrscheinlich weil sich das
window.name
im inneren fenster ändert.quelle
Wie Sie sagten, geht es hier nicht um das Zwischenspeichern von Iframe-Inhalten , sondern um das Zwischenspeichern von Iframe-URLs .
Ab September 2018 scheint das Problem immer noch in Chrome, aber nicht in Firefox aufzutreten.
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) und hier sind die einzigen zwei Lösungen, die von mir aus funktioniert haben:
1- Einfacher Weg: Erstellen Sie Ihren Iframe dynamisch aus Javascript
Beispielsweise:
2- Gewundener Weg
Wie hier erläutert , deaktivieren Sie auf der Serverseite das Zwischenspeichern von Inhalten für den Inhalt, den Sie für den Iframe ODER für die übergeordnete Seite bereitstellen ( beides reicht aus).
UND
Stellen Sie die Iframe-URL aus Javascript mit einem zusätzlichen sich ändernden Suchparameter wie folgt ein:
(vereinfachte Version, Vorsicht vor anderen Suchparametern)
quelle
Nachdem ich alles andere ausprobiert hatte (außer die Verwendung eines Proxys für den Iframe-Inhalt), fand ich eine Möglichkeit, das Zwischenspeichern von Iframe-Inhalten aus derselben Domäne zu verhindern :
Verwenden Sie
.htaccess
eine Umschreiberegel und ändern Sie das iframe-src
Attribut.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 dasselbe 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 gleichen Seite.
Sie können mit auf Ihre versteckten URL-Parameter zugreifen
$_SERVER["QUERY_STRING"]
quelle
Es ist ein Fehler in Firefox 3.5.
Schauen Sie mal rein .. https://bugzilla.mozilla.org/show_bug.cgi?id=279048
quelle
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 eine "andere" Anfrage und sucht nach neuen Inhalten.
In Javascript könnte es so aussehen:
quelle
Ich habe dieses Problem in der neuesten Version von Chrome sowie in der neuesten Version von Safari unter Mac OS X vom 17. März 2016 gefunden. Keine der oben genannten Korrekturen hat bei mir funktioniert, einschließlich der Zuweisung von src zu leer und dann zurück zu einer Site oder zum 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 Javascript zum Aktualisieren des IFRAME verwendet und nur den Hash in der URL gewechselt habe.
Die Problemumgehung in meinem Fall bestand darin, dass ich eine Zwischen-URL erstellt habe, die eine 0-Sekunden-Metaumleitung zu dieser anderen Seite hatte. Es geht so schnell, dass ich den Bildschirmblitz kaum bemerke. Außerdem habe ich die Hintergrundfarbe der Zwischenseite mit der der anderen Seite identisch gemacht, sodass Sie sie noch weniger bemerken.
quelle
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:
... irgendwo am Anfang von js Code (zum Beispiel im jquery $ () Handler)
Vielen Dank an http://www.freshsupercool.com/2008/07/10/firefox-caching-iframe-data/
quelle
Ich hatte dieses Problem auch 2016 mit iOS Safari. Was für mich zu funktionieren schien, war, dem iframe src einen GET-Parameter und einen Wert dafür zu geben
<iframe width="60%" src="../other/url?cachebust=1" allowfullscreen></iframe>
quelle
Haben Sie Fiddler2 installiert ?
Sie können genau sehen, was angefordert wird, was zurückgesendet wird usw. Es klingt nicht plausibel, dass der Browser seinen Cache für verschiedene URLs wirklich erreicht hat.
quelle
Wenn Sie wirklich verrückt werden möchten, können Sie den Seitennamen als dynamische URL implementieren, die immer auf dieselbe Seite aufgelöst wird, anstatt als Querystring-Option?
Angenommen, Sie befinden sich in einem Büro, überprüfen Sie, ob auf Netzwerkebene Caching stattfindet. Glauben Sie mir, es ist eine Möglichkeit. Ihre IT-Mitarbeiter können Ihnen mitteilen, ob es eine Netzwerkinfrastruktur rund um das HTTP-Caching gibt. Da dies jedoch nur für den Iframe geschieht, ist dies unwahrscheinlich.
quelle
Haben Sie versucht, der iframe-Seite die verschiedenen HTTP-Header-Optionen für No-Cache hinzuzufügen?
quelle