2010-12-17 2 views
1

J'ai une page Web avec une ressource à une adresse en constante évolution. Par exemple, la page Web peut être sur http: //www.monsite.com/? Page = page1 et elle peut contenir une image http: //www.monsite.com/? Img = image999. Bien que les deux ressources soient sur mon site, je ne contrôle pas le placement d'images particulières sur des pages particulières.Empêcher la mise en cache partielle des ressources Web

Je définis des en-têtes pour la mise en cache longue sur des pages ainsi que des images. Mais dans le cas où l'agent utilisateur ne met en cache que des pages web et non des images (ou par exemple, l'utilisateur efface le cache et l'image est effacée du cache), l'agent récupère la page du cache et fait une requête pour /? Img = image999. Cependant, à ce stade, l'image n'est plus à /? Image = image999 mais à la place, par exemple, /? Image = image998. Ainsi, l'image ne sera pas affichée à l'utilisateur.

Quelle est la solution à ce problème? Voici ceux que je pourrais penser à: -

  1. Désactiver la mise en cache des pages Web et des images. Pire solution.
  2. Désactiver la mise en cache des pages Web uniquement. Meilleure solution Rappelez-vous du côté serveur que image998 était une fois sur image999 et que si une requête venait pour /? Image = image999, redirigez/transférez-la vers /? Image = image998. Meilleure solution mais une peine à mettre en place. EDIT: En fait, je me rends compte maintenant cela est impossible dans ma situation sadface

Mon problème exact ne traite pas des images mais avec des vidéos HTML5. Plus précisément, sur Google Chrome, je remarque que les vidéos semblent être retirées du cache assez fréquemment même si je définis des dates d'expiration de 1 an dans le cache. Mais je suis toujours intéressé par la solution pour les ressources générales, indépendamment des politiques de mise en cache de Chrome.

EDIT: Pour confirmer, j'utilise "ne revalidate" + "expire dans 1 an" la mise en cache sur la page Web et l'image. Ainsi, si un agent d'utilisateur demande une fois la page Web (page1) + image (image999), il ne touchera pas le serveur pour les demandes suivantes et tout ira bien. Le problème se produit lorsque l'image disparaît du cache UA mais la page Web reste. Dans cette situation, l'agent d'utilisateur pas demande le serveur pour la page Web, mais demande le serveur pour l'image (image999). Cependant, entre-temps, l'image a changé d'URL (image999 -> image998) et le serveur retournera un 404. Le résultat est que l'UA n'affichera pas l'image. Comment puis-je empêcher cela?

+0

La page html qui contient le lien vers img999 doit changer et le navigateur doit demander une nouvelle page au lieu d'utiliser la version mise en cache car elle n'obtiendra pas un en-tête HTTP NOT-MODIFIED. Je ne comprends pas le problème. A la fin de la question, vous dites que le problème est qu'il n'est pas mis en cache, ce qui n'est pas ce que vous avez dit au début de la question (avoir un lien vers une ressource obsolète) –

+0

Désolé pour la confusion. C'est la page Web qui est mise en cache, mais pas l'image. J'ai besoin des deux pour être mis en cache. – Arnavion

+0

En outre, la raison pour laquelle je ne veux pas que la page Web soit téléchargée à nouveau lorsque l'URL de l'image change est que l'image est toujours la même, juste à une URL différente. Comme je l'ai dit, le vrai problème n'est pas avec les images, mais avec les vidéos HTML5, et l'URL en constante évolution est une mesure de prévention de liaison à chaud. Mais si un client a déjà demandé la page Web + vidéo, je m'en fous si elles le mettent en cache pour l'éternité. – Arnavion

Répondre

0

Comme mentionné dans la question, ce sont les solutions que je peux penser si je me limiterai à l'aide de l'en-tête Expires: -

  1. cache Désactiver pour les pages Web et des images.

  2. Activez uniquement la mise en cache pour les images. Chaque demande de la page Web sera traitée par le serveur, mais les demandes d'images mises en cache ne toucheront pas le serveur.

  3. Activez la mise en cache pour les pages Web et les images. Pour les demandes d'images obsolètes, envoyez une réponse "301 Moved Permanently" avec l'emplacement de la nouvelle image et demandez à l'UA de la mettre en cache. (Mes tests montrent que Google Chrome ne met pas en cache 301 demandes ou le contenu, il est redirigé vers quel que soit l'en-tête du cache)

Pour mon problème, j'ai renoncé à l'aide de l'en-tête Expires et suis au lieu d'utiliser ETag pour les pages Web et les images.De cette façon, je n'ai pas à gérer les demandes d'images obsolètes.

Questions connexes