10
votes

QueryString aléatoire pour éviter la mise en cache IE

C'est un problème bien connu que c'est-à-dire que c'est-à-dire cache trop de HTML, même lorsque vous donnez un Cache-Control: No-cache ou Dernière modification en-tête sur tous les applications.

Ce behiviour est vraiment troublant lorsque vous travaillez avec QueryStrings pour obtenir des informations dynamiques, car c'est-à-dire que c'est le considérant comme la même page (c.-à-d .: http://example.com/?id= 10 ) et sert la version mise en cache.

J'ai résolu l'ajout d'un nombre aléatoire ou d'un tigramme à la QueryString ( Comme d'autres personnes ont fait ) comme ce http://example.com/?id=10&t=2009-08-06_13:12:56 que je viens d'ignorer Serverside.

Y a-t-il une meilleure option? Y a-t-il un autre moyen plus propre d'accomplir cela? Je suis conscient que post n'est pas mis en cache, mais il est sémantique correct d'utiliser obtenir ici.


4 commentaires

Qu'est-ce que je demande: y a-t-il Autre façon de faire cela?


Votre affirmation est incorrecte, au fait. Ie ne "cache trop de HTML". Voir www.fiddler2.com/redir/?id=htttacperf pour la discussion sur la mise en cache dans IE.


@Eric, c'est-à-dire a un peu d'inattendu / incompatible comportement concernant la mise en cache .


en utilisant le générique $ .AJAX comme suggéré dans le message ci-dessus Stackoverflow.com/a/1767342/5969842 a aidé à résoudre le problème sans en utilisant un nombre aléatoire


6 Réponses :


0
votes

J'ai le même problème, mais prenez soin de vous en une seconde, il peut y avoir de nombreuses demandes. C'est pourquoi j'utilise ceci: xxx


1 commentaires

Eh bien, je ne veux pas que le même client frappe mon serveur plusieurs minuterie par seconde , cela ne vous dérange pas si les informations montrées sont de 1 seconde vieilles. Bien sûr, la sortie est un texte brut pour les humains.



2
votes

Utilisation d'un nombre aléatoire (pas d'horodatage) sur le querystring ou modifier réellement le nom de fichier sont les deux méthodes recommandées. Steve Souders and Yahoo! 'S Performance Group a publié un tonne de informations et pratiques utiles qu'ils ont découvertes et développées tout en optimisant l'une des propriétés les plus visibles au monde.


0 commentaires

6
votes

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


0 commentaires

0
votes

Avez-vous essayé d'ajouter un Etag en-tête dans la réponse? Vous pouvez utiliser un point aléatoire ou une somme de contrôle de la page générée afin que la version mise en cache soit servie lorsque vous approchez.

Je ne suis pas sûr de ce qui est le comportement d'IE, mais avec des versions récentes, cela devrait fonctionner.

Voir aussi le Section RFC HTTP sur Etag


0 commentaires

2
votes

Alors, à la fin, le seul moyen fiable de le faire (grâce à IE6) utilise un aléatoire, ou lié ​​ querystring.

Vous pouvez utiliser un lié ​​querystring qui ne change toutes les 15 secondes (ou tout autre laps de temps), de sorte que vous souhaitez baisser le nombre de succès du serveur, comme vous verriez le contenu mis en cache localement pour ces 15 secondes.

Si vous avez norme conforme du navigateur, vous pouvez vous en sortir avec seulement l'aide ETags .


3 commentaires

Cela échouera à nouveau si l'utilisateur revient à la page à l'aide du bouton arrière et effectue une actualisation de la page. Avez-vous pu trouver une solution sûre qui fonctionne dans tous les cas? Merci.


Vous générez la partie "aléatoire" du QueryString avec JavaScript Clientside comme indiqué sur Stackoverflow.com/questions/1234246/... de cette façon, ce sera différent chaque fois le obtenez ou < Code> Post est fait.


"... (Merci à IE6) est ..." Merci à IE7 aussi, je n'ai pas encore testé IE8.



11
votes

En supposant que vous utilisez jQuery, au lieu d'utiliser $ .GET ou $ .gejson, utilisez plus de dollars génériques $ .ajax et définissez explicitement la valeur de cache sur false. Ce qui suit est un exemple:

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


1 commentaires

Je dois constater que l'utilisation d'obtenir une demande d'obtention d'IE, nous devrions définir la mise en cache du HTML et que je définis le "cache: false" et cela empêchait d'apporter le résultat de cache..merics