2010-03-13 8 views

Répondre

2

Assurez-vous que vos réponses ne disent pas le navigateur que le contenu expire à l'avenir. Il y a deux en-têtes HTTP qui contrôlent cela.

  1. Expires
  2. Cache-Control - Il y a beaucoup de valeurs possibles pour cet en-tête, mais celui qui contrôle l'expiration est max-age = toto.

En outre, IE peut être revalidant. Cela signifie que IE inclut des informations supplémentaires dans la requête qui indiquent au serveur Web quelle version de la ressource il a dans son cache. Si la version mise en cache du navigateur est à jour, votre serveur peut répondre avec 304 Not Modified et ne pas inclure le contenu dans les réponses. Les requêtes "Conditionatl GET" incluent ces informations de version. Il est possible que votre serveur donne 304 réponses alors que ce ne devrait pas être le cas.

Il y a deux ensembles de têtes qui contrôlent revalidation:

  1. Last-Modified + If-Modified-Since
  2. ETag + If-None-Match

Last-Modified, et ETag sont des en-têtes de réponse qui indiquent au navigateur la version de la ressource qu'il est sur le point de recevoir. Si vous ne souhaitez pas que les navigateurs soient revalidés, ne les définissez pas. If-Modified-Since et If-None-Match sont les en-têtes de requête correspondants que le navigateur utilise pour signaler la version d'une ressource périmée dont il a besoin pour revalider avec le serveur.

Il existe différents outils pour voir les en-têtes HTTP renvoyés par votre serveur au navigateur. L'un est l'extension Firefox Live HTTP Headers. Un autre outil, que Steve Sounders recommande est IBM Page Detailer. Je n'ai pas essayé celui-ci moi-même, mais cela ne dépend pas du navigateur que vous utilisez.

1

Ceci est un problème courant - IE met en cache toutes les requêtes ajax/json du côté client. Les autres navigateurs ne le font pas. Pour contourner ce problème, générez un nombre aléatoire et ajoutez-le à l'URL de votre demande en tant que variable. Cela imbécile IE en pensant que c'est une nouvelle demande.

Voici un exemple en javascript, vous pouvez faire quelque chose de similaire en Python:

function rand() { 
    return Math.floor(Math.random()*100000); 
} 

$("#content").load("/posts/view/1?rand="+rand()); 
+0

J'aime cette approche aussi, et c'est ce que je suis en train de faire, mais je préfère avoir juste l'en-tête IE dire de ne pas mettre en cache – resopollution

+0

Je ne savais pas qu'il était possible de mettre no- En-têtes de cache pour une requête JSON. C'est certainement une meilleure solution si vous pouvez le faire fonctionner. –

3

Assurez-vous que vos en-têtes de réponse ont:

Cache-Control: no-cache 
Pragma: no-cache 
Expires=-1 
+3

Sûrement vous ne vouliez pas dire un signe d'égalité après "Expire", non? – temoto

1

La bibliothèque jQuery a assez belles fonctions ajax, et les paramètres pour les contrôler. L'un d'entre eux est appelé "cache" et il ajoute automatiquement un nombre aléatoire à la requête qui force le navigateur à ne pas mettre en cache la page. Cela peut être défini avec le paramètre "dataType", qui peut être défini sur "json" pour que la requête ajax obtienne des données json. J'ai utilisé ceci dans mon code et n'ai pas eu de problème avec IE.

Hope this helps

Questions connexes