Force le navigateur à recharger toutes les cache après la mise à jour du site
Est-il un moyen de forcer les clients d'un site web pour recharger le cache (images, javascript, etc) après un serveur a été poussé une mise à jour de la base de code? Nous recevons beaucoup d'appels à l'assistance de se demander pourquoi certaines fonctionnalités ne fonctionne plus. Un simple rafraîchissement résout les problèmes de télécharger la dernière mise à jour du fichier javascript.
Pour plus de détails, nous sommes à l'aide de Glassfish 3.x. et JSF 2.1.x. Cela pourrait s'appliquer à plus que juste JSF bien sûr.
Pour décrire ce comportement, je l'espère, est possible:
Site Une a deux images et deux fichiers javascript. Un utilisateur visite le site et le 4, les fichiers mis en cache. Pour autant que je suis concerné, pas besoin de "re-télécharger", a déclaré fichiers, sauf si l'utilisateur spécifiquement les forces d'un "dur" actualiser ou efface la mémoire cache. Une fois qu'un site est poussé une mise à jour de l'un des fichiers, le serveur pourrait avoir une sorte de métadonnées de l'en-tête d'informer le client de ladite mise à jour. Si le client choisit, le nouveau fichier sera téléchargé.
Ce que je ne veux pas faire est de mettre de la méta-balise dans l'en-tête d'une page à force de rien de jamais être mis en cache...je veux juste quelque chose qui indique au client une mise à jour a eu lieu et il devrait être à plus tard une fois que quelque chose a été mis à jour. Je suppose que ce serait juste une sorte de contrôle de version sur le côté client.
Merci pour votre temps!
OriginalL'auteur Mickelback | 2013-04-10
Vous devez vous connecter pour publier un commentaire.
La bonne façon de gérer cela est de changer l'URL de la convention de vos ressources. Par exemple, nous avons:
Pour obtenir le navigateur pour toujours le fichier dans le cache, mais le faire de la bonne façon avec la gestion des versions, est d'ajouter quelque chose à l'URL. L'ajout d'une valeur à la chaîne de requête ne permet pas la mise en cache, donc de la place pour mettre c'est après
/resources/
.Une référence pour la chaîne de requête de mise en cache: http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.9
Ainsi, par exemple, votre Url:
Donc ce que vous pourriez faire est d'utiliser le projet de numéro de version (ou une autre valeur dans un properties/config fichier que vous modifiez manuellement lorsque vous souhaitez que les fichiers mis en cache pour être rechargé) puisque ce nombre devrait changer seulement lorsque le projet est modifié. Si votre URL pourrait ressembler à:
Qui devrait être assez facile.
Le problème est maintenant avec la cartographie de l'URL, car cette valeur dans le milieu est dynamique. La façon dont nous avons surmonté c'est avec un module de réécriture d'URL qui nous a permis de filtrer les Url avant d'arriver à notre application. La réécriture regardé pour les Url qui ressemble à:
Et enlevé le
cacheholder_______/
partie. Lors de la réécriture, il ressemblait à une requête normale, et le serveur répond avec le fichier correct, sans autre spécifique de la cartographie et de la logique...le point est que le navigateur pensais que c'était un nouveau fichier (même si ce n'était pas vraiment), donc il l'a demandé, et le serveur chiffres et sert le fichier correct (même si c'est une URL "bizarre").Bien sûr, une autre option est d'ajouter cette chaîne dynamique pour le nom de fichier lui-même, et ensuite utiliser la réécriture de l'outil pour l'enlever. De toute façon, la même chose est faite de ciblage d'une chaîne de texte au cours de réécriture, et le retirer. Cela permet de tromper le navigateur, mais pas sur le serveur 🙂
Mise à JOUR:
Une alternative que j'aime vraiment, c'est de définir le nom de fichier basé sur le contenu, et le cache. Par exemple, cela pourrait être fait avec une table de hachage. Bien sûr, ce genre de chose n'est pas quelque chose que vous auriez faire manuellement et de les enregistrer à votre projet (espérons-le); c'est quelque chose que votre application/cadre doit traiter. Par exemple, dans le Graal, il y a un plugin que "les hachages et les caches" des ressources, de sorte que les éléments suivants se produit:
<script>
/<link>
les balises de votre page, hachés nom est utiliséCe qui est cool à propos de cette configuration est que vous n'avez pas à vous soucier de la mise en cache correctement viens de mettre les fichiers de cache pour toujours, et le malaxage doit prendre soin de fichiers/mappages d'être disponible en fonction de leur contenu. Elle offre également la possibilité pour les restaurations/annulations d'ores et déjà être mis en cache et chargé rapidement.
Merci de ne pas référence W3Schools sur le réel W3 de la documentation. Votre point est invalide, veuillez lire le lien que j'ai posté ou de fournir quelque chose de plus légitime
Pas besoin d'obtenir en colère contre moi à ce sujet. Les serveurs web, j'ai déployé avons tous en mémoire cache de requête url. Qui serveur(s) avez-vous observé en cache pas? À partir de votre lien:
"This specifically means that responses from HTTP/1.0 servers for such URIs SHOULD NOT be taken from a cache."
Peut-être des changements dans HTTP/1.1 pourrait expliquer cette différence de comportement?cela peut expliquer pourquoi il y a un problème avec http1.0 requêtes w3.org/Protocols/rfc2616/rfc2616-sec14.html
OriginalL'auteur Ian
- je utiliser un no-cache paramètre pour cette situations...
une chaîne de valeur constante comme (à partir du fichier de config)
et dans les pages, j'utilise des actifs comme le
et quand je l'ai mise à jour mon code, il suffit de changer le $no_cache valeur, et il fonctionne comme un charme.
si vous ne modifiez pas no_cache valeur, les fichiers statiques seront mis en cache. faire le changement que lorsque vous avez changé statique des choses.
Non, ce n'est pas vrai. Quoi que ce soit avec une chaîne de requête ne devrait pas être mis en cache, selon la spécification HTTP. Certains navigateurs, certains ne le font pas. Ainsi, le navigateur sera toujours en faire la demande puisqu'il y a une querystring à la fin. Le serveur a peut-être mis en cache, ce qui est agréable, mais c'est toujours pas mis en cache sur le client.
vous êtes à la mauvaise interprétation de l'énoncé dans l'url que vous avez fourni, il est lié à http1.0 les serveurs ne pas http1.1 serveurs dont la plupart des serveurs sont aujourd'hui.
OriginalL'auteur tanaydin