155 votes

Briser la mémoire cache via les paramètres

Nous voulons que les déploiements de production se fassent en cache, mais sans perdre beaucoup de temps à mettre au point un système pour le faire. Mon idée était d'appliquer un paramètre à la fin des fichiers css et js avec le numéro de version actuel :

<link rel="stylesheet" href="base_url.com/file.css?v=1.123"/>

Deux questions : Est-ce que cela va effectivement casser le cache ? Le paramètre fera-t-il en sorte que le navigateur ne mette jamais en cache la réponse de cette url puisque le paramètre indique qu'il s'agit d'un contenu dynamique ?

143voto

Marshall Points 2498

Le paramètre ?v=1.123 indique une chaîne de requête, et le navigateur pensera donc qu'il s'agit d'un nouveau chemin à partir de, disons, ?v=1.0 . Ainsi, le chargement s'effectue à partir du fichier et non du cache. Comme vous le souhaitez.

De plus, le navigateur supposera que la source restera la même la prochaine fois que vous appellerez ?v=1.123 y debe le cache avec cette chaîne. Il restera donc en cache, quelle que soit la configuration de votre serveur, jusqu'à ce que vous passiez à ?v=1.124 etc.

6 votes

Citation de Steve Souders : "Pour bénéficier de la mise en cache par les proxys les plus populaires, évitez de réviser avec une chaîne de requête et révisez plutôt le nom de fichier lui-même." L'explication complète se trouve ici : stevesouders.com/blog/2008/08/23/

33 votes

Cet article de blog date d'une dizaine d'années maintenant. Pensez-vous que les fournisseurs de cache et les CDN l'ont encore intégré ? Squid semble être capable de mettre en cache des documents avec des chaînes de requête maintenant .

1 votes

Peut-être que cela aidera quelqu'un : Personnellement, j'utilise l'horodatage de la modification du fichier comme paramètre de version "automatique", par exemple. <link rel="stylesheet" href="style.css?v=1487935578" />

42voto

Pekka 웃 Points 249607

Deux questions : Est-ce que cela va effectivement briser le cache ?

Oui. Même Stack Overflow utilise cette méthode, bien que je me souvienne qu'ils (avec leurs millions de visiteurs par jour et des zillions de versions et de configurations différentes de clients et de proxy) ont eu quelques cas extrêmes où même cela n'a pas suffi à briser le cache. Mais l'hypothèse générale est que cela fonctionnera et qu'il s'agit d'une méthode appropriée pour casser le cache sur les clients.

Le paramètre fera-t-il en sorte que le navigateur ne mette jamais en cache la réponse de cette url puisque le paramètre indique qu'il s'agit d'un contenu dynamique ?

Non. Le paramètre ne modifie pas la politique de mise en cache ; les en-têtes de mise en cache envoyés par le serveur s'appliquent toujours, et s'il n'en envoie pas, les valeurs par défaut du navigateur.

1 votes

@spender Je n'arrive pas à trouver la référence pour l'instant, mais il y a un long article de blog ou une réponse à l'OS où Jeff Atwood en parle (IIRC).

2 votes

@spender J'ai lu que certains serveurs proxy (soit anciens, soit configurables) ignorent la chaîne de requête lors de la mise en cache.

2 votes

@spender - J'ai entendu la même chose, et je pense que changer le nom du fichier ou le chemin est la meilleure option. Il peut être plus facile de laisser tous vos fichiers statiques sous un nom de dossier versionné, par exemple, /static/v22/file.css car vous pouvez renommer plusieurs fichiers avec un seul dossier, par exemple /static/v23/file.css y /static/v23/mystuff.js

24voto

jfriend00 Points 152127

Il est plus sûr d'indiquer le numéro de version dans le nom du fichier. Cela permet à plusieurs versions d'exister en même temps, de sorte que vous pouvez déployer une nouvelle version et, s'il existe encore des pages HTML mises en cache qui demandent l'ancienne version, elles obtiendront la version qui fonctionne avec leur HTML.

Notez que dans l'un des plus grands déploiements de versions sur Internet, jQuery utilise les numéros de version dans le nom du fichier et permet à plusieurs versions de coexister sans logique particulière côté serveur (chaque version est simplement un fichier différent).

Cela détruit le cache une fois lorsque vous déployez de nouvelles pages et de nouveaux fichiers liés (ce que vous souhaitez) et à partir de ce moment-là, ces versions peuvent être effectivement mises en cache (ce que vous souhaitez également).

0 votes

Je suis d'accord avec cela, mais il est beaucoup plus facile de demander à Sinatra d'ajouter ?v=<%=VERSION%> à toutes les requêtes css et js plutôt que d'avoir à contrôler chaque fichier individuellement. Finalement, nous passerons à sinatra-assetpack, qui prétraitera et compressera tous les fichiers et ajoutera un numéro de version au nom du fichier, ce qui nous permettra de les contrôler individuellement beaucoup plus facilement.

2 votes

Je suis d'accord pour dire que mettre le numéro de version dans le nom du fichier est la solution la plus sûre si l'on veut être sûr à 100 %, mais je ne suis pas l'argument selon lequel "plusieurs versions doivent exister en même temps". Une URL avec un paramètre de requête est distincte de la même URL avec un paramètre de requête différent. Le client doit les traiter comme deux ressources différentes ; si ce n'est pas le cas, le client est défaillant.

2 votes

@Pekka - le numéro de version peut permettre l'existence de plusieurs versions à la fois, mais cela nécessite la coopération du serveur pour faire correspondre le paramètre de la requête au fichier réel correct. Je ne pense pas que ce soit ce que l'OP fait ici et il n'y a pas de raison de demander cette complication alors que la modification du nom de fichier est beaucoup plus simple et ne nécessite pas de coopération de la part du serveur. Il est évident que les deux peuvent fonctionner.

9voto

ncremins Points 5044

Le cache ne sera vidé qu'une seule fois, après que le client a téléchargé la ressource, toutes les autres réponses seront servies à partir du cache du client, à moins qu'il ne s'agisse d'une réponse à une question :

  1. le paramètre v est mis à jour.
  2. le client vide son cache

6voto

Ken Liu Points 7779

En général, tout devrait bien se passer, mais il est possible que cela ne fonctionne pas s'il existe un cache intermédiaire (un proxy) qui est configuré pour ignorer les paramètres de la demande.

Par exemple, si vous diffusez un contenu statique par l'intermédiaire du réseau CDN d'Akamai, celui-ci peut être configuré de manière à ignorer les paramètres de la requête afin d'éviter la destruction du cache à l'aide de cette méthode.

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