2009-08-05 9 views
10

Il est un problème bien connu que IE cache trop de html, même en donnant un en-tête Cache-Control: no-cache ou Last-Modified à everypage.Querystring aléatoire pour éviter la mise en cache IE

Ce behaiviour est vraiment troublant lorsque l'on travaille avec querystrings pour obtenir des informations dynamiques, comme IE considère comme la même page (i.e. .: http://example.com/?id=10) et sert la version en cache.

Je l'ai résolu en ajoutant un nombre aléatoire ou un timestring à la chaîne de requête (as others have done) comme ceci http://example.com/?id=10&t=2009-08-06_13:12:56 que j'ignore juste côté serveur.

Existe-t-il une meilleure option? Y a-t-il une autre façon plus propre d'accomplir cela? Je suis conscient que POST n'est pas mis en cache, mais il est sémantiquement correct d'utiliser GET ici.

+0

Ce que je demande: y a-t-il un autre moyen de le faire? – voyager

+0

Votre assertion est incorrecte, d'ailleurs. IE ne cache pas trop de HTML. Voir www.fiddler2.com/redir/?id=httpperf pour une discussion sur la mise en cache dans IE. – EricLaw

+1

@Eric, IE a un [comportement] inattendu/incohérent (http://support.microsoft.com/kb/222064/) [en ce qui concerne la mise en cache] (http://support.microsoft.com/kb/234067). – voyager

Répondre

2

Ainsi, à la fin, la seule façon de le faire (grâce à IE6) fiable avec une random, ou time bound querystring.

Vous pouvez utiliser un time bound querystring qui ne change que toutes les 15 secondes (ou tout autre laps de temps), de sorte que vous voulez baisser le serveur comte frappé, comme vous verriez le contenu mis en cache localement pour ces 15 secondes.

Si vous avez a standard compliant browser, vous pouvez vous en sortir avec seulement l'aide ETags.

+0

Cette opération échouera à nouveau si l'utilisateur revient à la page en utilisant le bouton Précédent et actualise la page. Avez-vous trouvé une solution sûre qui fonctionne dans tous les cas? Merci. – lostInTransit

+0

Vous générez la partie "aléatoire" de la chaîne de requête avec javascript clientide comme indiqué sur http://stackoverflow.com/questions/1234246/random-querystring-to-avoid-ie-caching/1234260#1234260 De cette façon, il sera différent * à chaque fois * le 'get' ou' post' est fait. – voyager

+0

"... (grâce à IE6) est ..." grâce à IE7 aussi, je n'ai pas encore testé IE8. –

0

J'ai le même problème, mais attention, en une seconde il peut y avoir beaucoup de demandes. Voilà pourquoi j'utilise ceci:

$.getJSON("http://server/example?param=value&dummy=" + Math.random(), ...); 
+0

Eh bien, je ne veux pas le ** même client ** frapper mon serveur ** plusieurs minuteries par seconde **, donc je ne me dérange pas si l'information a montré est 1 seconde. Bien sûr, la sortie est un texte brut pour les humains. – voyager

2

L'utilisation d'un nombre aléatoire (pas d'horodatage) sur la chaîne de requête, ou réellement changer le nom de fichier sont les deux méthodes recommandées. Steve Souders et YAHOO!'s performance group ont publié un ton des informations utiles et des pratiques qu'ils ont découvertes et développées tout en optimisant l'une des propriétés les plus visitées au monde.

6

Vous pouvez également utiliser l'heure Unix en cours en millisecondes pour éviter le problème de nombreuses demandes en une seconde (il est beaucoup moins susceptibles d'avoir plusieurs demandes en une milliseconde)

var url = "http://whatever.com/stuff?key=value&ie=" + (new Date()).getTime(); 
0

Avez-vous essayé d'ajouter un ETag en-tête dans la réponse? Vous pouvez utiliser une valeur aléatoire ou une somme de contrôle de la page générée afin que la version mise en cache soit diffusée le cas échéant.

Je ne suis pas sûr quel est le comportement de IE, mais avec les versions récentes, il devrait fonctionner.

Voir aussi la HTTP RFC section on ETag

11

En supposant que vous utilisez jQuery, au lieu d'utiliser $ .get ou $ .getJson, utilisez le plus générique $ .ajax et définissez explicitement la valeur du cache sur false.Voici un exemple:

$.ajax({ 
     url: "/Controller/Action", 
     cache: false, 
     type: "GET", 
     dataType: "json", 
     success: function(data, textStatus) { 
         alert("success"); 
       } 
    }); 

Un peu plus de code nécessaire (pas beaucoup si) que d'utiliser .getJson ou .get mais résoudre le problème proprement sans ajouter des nombres aléatoires.

+0

Je dois trouver que l'utilisation de la requête GET dans IE, nous devrions définir le ne pas mettre en cache le html et j'ai mis 'cache: false' et qui empêché IE d'apporter le résultat de cache..thanks – Lucky

Questions connexes