95 votes

Prévention de la mise en cache iframe dans le navigateur

Comment voulez-vous empêcher Firefox et Safari de mise en cache de contenu de l'iframe?

J'ai une simple page web avec une iframe à une page sur un site différent. À la fois l'extérieur de la page et la page intérieure ont-têtes de réponse HTTP pour empêcher la mise en cache. Lorsque je clique sur le bouton "retour" dans le navigateur, à l'extérieur de la page fonctionne correctement, mais peu importe, le navigateur récupère toujours un cache de la iframed page. IE fonctionne très bien, mais Firefox et Safari m'en difficulté.

Ma page ressemble à quelque chose comme ceci:

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

L' var variable change toujours. Malgré le fait que l'URL de l'iframe a changé (et donc, le navigateur devrait être de faire une nouvelle demande à la page), le navigateur récupère le contenu mis en cache.

J'ai examiné les requêtes et réponses HTTP et va-et-vient, et j'ai remarqué que même si l'extérieur de la page contient <iframe src="webpage2.html?var=222" />, le navigateur va alors récupérer webpage2.html?var=111.

Voici ce que j'ai essayé jusqu'à présent:

  • Changer iframe URL aléatoire var valeur
  • L'ajout d'Expiration, Cache-Control, et Pragma-têtes à l'extérieur de la page web
  • L'ajout d'Expiration, Cache-Control, et Pragma-têtes à l'intérieur de la page web

Je ne suis pas en mesure de faire toutes les astuces JavaScript parce que je suis bloquée par la même la politique de l'origine.

Je suis à cours d'idées. Personne ne sait comment arrêter le navigateur de mise en cache de la iframed contenu?

Mise à jour

J'ai installé Fiddler2 que Daniel a suggéré d'effectuer un autre test, et malheureusement, je reçois toujours le même résultats.

C'est le test que j'ai effectué:

  1. Externe page génère le nombre aléatoire à l'aide de Math.random() en JSP.
  2. Externe page affiche nombre aléatoire sur la page web.
  3. Externe les appels en page iframe, passant de nombre aléatoire.
  4. Intérieure page affiche nombre aléatoire.

Avec ce test, je suis en mesure de voir exactement quelles sont les pages de mise à jour, et les pages sont mises en cache.

Test Visuel

Pour un test rapide, je charge la page, accédez à une autre page, puis appuyez sur "retour". Voici les résultats:

Page D'Origine:

  • Externe Page: 0.21300034290246206
  • Intérieure Page: 0.21300034290246206

Quitter la page, puis en appuyant sur retour:

  • Externe page: 0.4470929019483644
  • Intérieure page: 0.21300034290246206

Cela montre que l'intérieur de la page est mise en cache, même si l'extérieur de la page est de l'appeler avec un autre paramètre GET dans l'URL. Pour une raison quelconque, le navigateur est en ignorant le fait que l'iframe est de demander un nouveau URL; il a simplement charges de l'ancien.

Fiddler Test

Bien sûr, le Violoneux, confirme la même chose.

(Je charge la page.)

Externe page est appelée. HTML:

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

http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206 est appelé.

(Je naviguez à partir de la page et ensuite frapper en retour.)

Externe page est appelée. HTML:

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

http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206 est appelé.

Eh bien, à partir de ce test, il semble que si le navigateur web n'est pas mise en cache de la page, mais il cache l'URL de l'iframe et ensuite faire une nouvelle demande sur la mise en cache de l'URL. Cependant, je suis toujours perplexe quant à la façon de résoudre ce problème.

Quelqu'un a une idée sur la façon d'arrêter le navigateur web à partir de la mise en cache iframe Url?

63voto

Caleb Points 614

C'est un bug dans Firefox:

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

Essayez cette solution de contournement:

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

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

38voto

STRML Points 76

J'ai été en mesure de contourner ce problème en définissant un unique name l'attribut dans l'iframe - pour quelque raison que ce soit, il semble que ce buste à la mémoire cache. Vous pouvez utiliser quelle que soit la dynamique de données que vous avez en tant qu' name de l'attribut ou simplement au courant ms ou ns de temps quelle que soit la création de modèles de langage que vous utilisez. C'est une meilleure solution que celles ci-dessus, car il n'exige pas directement en JS.

Dans mon cas particulier, l'iframe est en cours de construction par JS (mais vous pouvez faire la même chose via PHP, Ruby, peu importe), donc j'ai simplement utiliser Date.now():

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

Cette version corrige le bug dans mes tests; sans doute parce que l' window.name dans l'intérieur de la fenêtre change.

3voto

renga Points 31

C'est un bug dans Firefox 3.5.

Jetez un coup d'œil .. https://bugzilla.mozilla.org/show_bug.cgi?id=279048

3voto

Division Six Points 3

Pour que l'iframe charge toujours le nouveau contenu, ajoutez le timestamp Unix actuel à la fin des paramètres GET. Le navigateur la considère alors comme une requête "différente" et cherchera un nouveau contenu.

En Javascript, cela pourrait ressembler à:

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

-4voto

kmoser Points 286

Faites pointer l'URL de l'iframe sur une page de votre site servant de proxy pour extraire et renvoyer le contenu réel de l'iframe. Maintenant, vous n'êtes plus lié par la politique de même origine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X