374 votes

Forcez le navigateur à vider le cache

Existe-t-il un moyen de placer un code sur ma page pour que, lorsqu'une personne visite un site, le cache du navigateur soit effacé et qu'elle puisse voir les modifications ?

Langues utilisées : ASP.NET, VB.NET, et bien sûr html, css, et jquery.

0 votes

Une bonne solution ou une solution de contournement pour "vider le cache" peut être trouvée ici : stackoverflow.com/a/43676353/2008111

454voto

Fermin Points 12964

Si c'est pour voir les changements de css ou de js, une solution est d'ajouter _versionNo au fichier css/js pour chaque version. Par exemple

script_1.0.css script_1.1.css script_1.2.css etc.

Vous pouvez consulter cette lien pour voir comment cela pourrait fonctionner.

15 votes

C'est une assez bonne solution, qui peut même être automatisée par votre système de construction (et devrait l'être). Stackoverflow, par exemple, utilise cette approche.

8 votes

SO utilise des arguments GET maintenant.

80 votes

La meilleure solution consiste à conserver le nom du fichier tel quel, mais à ajouter le numéro de version en tant que paramètre de la chaîne de recherche, par exemple script.js?v=1.2 . (Ou si vous ne suivez pas les versions, utilisez simplement l'heure de dernière modification du fichier, ce qui est encore plus facile à faire). Je ne sais pas si c'est ce que le commentateur précédent voulait dire !

134voto

Jonathan Sampson Points 121800

Regardez dans le cache-control et le expirant à Balise META.

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="EXPIRES" CONTENT="Mon, 22 Jul 2002 11:12:01 GMT">

Une autre pratique courante consiste à ajouter des chaînes de caractères changeant constamment à la fin des fichiers demandés. Par exemple :

<script type="text/javascript" src="main.js?v=12392823"></script>

62 votes

Cela ne sera pas d'une grande aide dans le cas où il est déjà mis en cache - puisqu'il est mis en cache, le serveur ne sera pas interrogé, et ne pourra donc pas répondre avec no-cache. De plus, cette balise meta ne devrait pas être utilisée, comme le dit la note, elle ne fonctionnera pas avec les caches web.

1 votes

+1 ce que derobert a dit. Il est toujours préférable d'utiliser les en-têtes HTTP pour suggérer une politique de cache aux clients et aux caches web, mais même cela ne fonctionne pas pour forcer un rechargement du cache.

5 votes

+1 pour votre deuxième solution. J'ai ce problème que le cache doit être effacé seulement la première fois après qu'un administrateur ait fait une mise à jour. Cette approche devrait résoudre ce problème

82voto

rsp Points 11526

C'est une vieille question mais je pense qu'il faut y répondre de manière plus actuelle car il existe désormais un moyen de mieux contrôler la mise en cache des sites Web.

Sur Applications Web hors ligne (c'est-à-dire tout site web HTML5) applicationCache.swapCache() peut être utilisé pour mettre à jour la version en cache de votre site web sans avoir à recharger manuellement la page.

Voici un exemple de code tiré du Guide du débutant pour l'utilisation du cache d'application sur les rochers HTML5 expliquant comment mettre à jour les utilisateurs vers la dernière version de votre site :

// Check if a new cache is available on page load.
window.addEventListener('load', function(e) {

  window.applicationCache.addEventListener('updateready', function(e) {
    if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
      // Browser downloaded a new app cache.
      // Swap it in and reload the page to get the new hotness.
      window.applicationCache.swapCache();
      if (confirm('A new version of this site is available. Load it?')) {
        window.location.reload();
      }
    } else {
      // Manifest didn't changed. Nothing new to server.
    }
  }, false);

}, false);

Voir aussi Utilisation du cache de l'application sur Mozilla Developer Network pour plus d'informations.

1 votes

Cela signifie-t-il que vous devez utiliser et maintenir un fichier manifeste de cache ?

0 votes

Attention : l'interface Application Cache (AppCache) a été dépréciée.

74 votes

Alors, quelle est la recommandation actuelle en 2017 ?

27voto

Pekka 웃 Points 249607

Pas en tant que tel. Une méthode consiste à envoyer les en-têtes appropriés lors de la diffusion du contenu afin de forcer le navigateur à se recharger :

S'assurer qu'une page web n'est pas mise en cache, dans tous les navigateurs.

Si votre recherche de "cache header" ou quelque chose de similaire ici sur SO, vous trouverez des exemples spécifiques à ASP.NET.

Une autre solution, moins propre mais parfois unique si vous ne pouvez pas contrôler les en-têtes côté serveur, consiste à ajouter un paramètre GET aléatoire à la ressource qui est appelée :

myimage.gif?random=1923849839

3 votes

Il est vraiment préférable de versionner correctement les fichiers. C'est un gros gaspillage de bande passante et, ce qui est probablement plus important, cela ralentit beaucoup votre site.

8 votes

Cela dépend vraiment de la situation, n'est-ce pas ? Si vous programmez un CMS et devez vous assurer que toutes les ressources modifiées sont correctement mises à jour, il est parfois impossible de contourner l'une de ces deux options.

0 votes

Les solutions de ce type devraient faire l'objet d'un vote négatif. C'est à nous de maintenir l'empreinte CO2 de l'internet aussi basse que possible.

16voto

Pour ressources statiques La bonne mise en cache serait de utiliser les paramètres de la requête avec la valeur de chaque version de déploiement ou de fichier. Cela aura pour effet de vider le cache après chaque déploiement.

/Content/css/Site.css?version={FileVersionNumber}

Voici un exemple d'ASP.NET MVC.

<link href="@Url.Content("~/Content/Css/Reset.css")?version=@this.GetType().Assembly.GetName().Version" rel="stylesheet" type="text/css" />

N'oubliez pas de mettre à jour la version de l'assemblage.

1 votes

Merci pour cette réponse mais comment faire lorsque nous ajoutons des ressources dans la BundleTable ?

1 votes

Dans mon cas, cela retournait "0.0.0.0" comme version. Pour obtenir la version de la dll de votre application MVC, utilisez plutôt ceci : ?version=@ViewContext.Controller.GetType().Assembly.GetName(‌​).Version

2 votes

J'ai constaté que cela empêche Firefox et Chrome de mettre le contenu en cache.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X