web-dev-qa-db-fra.com

Évitez la mise en cache des réponses http

Quelle est la solution définitive pour éviter toute sorte de mise en cache des données http? Nous pouvons modifier le client ainsi que le serveur - je pense donc que nous pouvons diviser la tâche entre le client et le serveur.

Client peut ajouter à chaque requête un paramètre aléatoire http://URL/path?rand=6372637263 - Mon sentiment est que l'utilisation de cette façon ne fonctionne pas à 100% - il pourrait y avoir des proxys intelligents, qui peuvent détecter cela ... De l'autre côté, je pense que si l'URL est différente de la précédente, le proxy ne peut pas simplement décider de renvoyer une réponse en cache.

Sur serveur peut contrôler un tas d'en-têtes HTTP:

Expires: Tue, 03 Jul 2001 06:00:00 GMT
Last-Modified: {now} GMT
Cache-Control: no-store, no-cache, must-revalidate, max-age=0
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache

Des commentaires à ce sujet, quelle est la meilleure approche?

30
STeN

Les en-têtes de contrôle du cache côté serveur doivent ressembler à:

Expires: Tue, 03 Jul 2001 06:00:00 GMT
Last-Modified: {now} GMT
Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate

Évitez de réécrire les URL sur le client car cela pollue les caches et provoque d'autres problèmes sémantiques étranges. En outre:

  • Utilisez un en-tête Cache-Control (Voir rfc 2616 ) car le comportement avec plusieurs entrées n'est pas défini. De plus, les entrées spécifiques à MSIE dans le deuxième contrôle de cache sont au mieux redondantes .

  • no-store Concerne la sécurité des données. (cela signifie seulement de ne pas écrire ceci sur le disque - les caches sont toujours autorisés à stocker la réponse en mémoire).

  • Pragma: no-cache N'a pas de sens dans une réponse du serveur - c'est un en-tête de demande, ce qui signifie que tout cache recevant la demande doit la transmettre à l'origine.

  • L'utilisation de Expires (http/1.0) et cache-control (http/1.1) n'est pas redondante car il existe des proxys qui ne parlent que http/1.0, ou déclassent le protocole.

  • Techniquement, le dernier en-tête modifié est redondant à la lumière de no-cache, Mais c'est une bonne idée de le laisser là.

  • Certains navigateurs ignoreront les directives suivantes dans un en-tête de contrôle de cache après en avoir rencontré une qu'ils ne reconnaissent pas - alors mettez d'abord les choses importantes.

43
symcbean

Ajout d'un en-tête

Cache-control: private

garantit que le cache gataway ne mettra pas en cache une telle demande.

J'aimerais vous recommander la conférence de Fabien Potencier sur la mise en cache: http://www.slideshare.net/fabpot/caching-on-the-Edge

4
Jarosław Gomułka