Blog
Vider le cache … ou pas !

Partager

Videz votre cache ...

On ne peut décemment pas expliquer à chaque client, utilisateur ou anonyme comment “vider le cache” à chaque fois qu’on change 2 css, 3 lignes de js et que l'on repousse un nouvelle version en prod ! On peut toujours faire la politique de l'autruche :) http://www.commitstrip.com/fr/2013/10/11/mieux-et-moins-cher-que-les-tests-unitaires/ (j'ai beaucoup ri, merci commitstrip !)

Une solution "améliorée"

Toutes les solutions qui trainent sur le net suggèrent de rajouter un timestamp en paramètre ?_=1387414279. Ça résoud partiellement le problème, mais quid des @import, des background-image appelés depuis un CSS, des ressources chargées dans un JS ? En plus, certaines configuration de browser mobile, puisque la bande passante est limitée, mettent en cache les ressources malgré les différents paramètres. Ce n’est donc pas la solution ultime.

Une autre solution consiste à préfixer le dossier où sont stockés les fichiers de ressources plutôt que de suffixer :

<link href="/static1234/stylesheet.css" type="text/css">
<script src="/static1234/script.js"></script>

En respectant la relativité des chemins de fichiers, en CSS toutes les ressources se réfèrent au dossier du fichier inclu. En javascript, on peut détecter le dossier du script via document.getElementsById(‘script’) ... le stocker dans une variable et la réutiliser chaque fois que l’on charge un autre fichier (un peu à la manière de __DIR__ en PHP).

Admin sys

Sur Apache, il suffit de rajouter cette règle de réécriture :
RewriteEngine	on
RewriteRule ^static[a-zA-Z0-9]+(/.*)$ $1$2 [PT]
J’utilise cette requête sur Nginx :
if ($request_filename ~ "/static[a-zA-Z0-9]+") {
        rewrite /[^\/]+/(.*) /static/$1;
}

Dans la template coté serveur, il suffit de changer le chiffre de l’URL par la révision svn / git ou un timestamp. Le browser croit devoir télécharger les fichiers d’un nouveau dossier, puis les ressources contenues dans ce dossier (alors que c’est toujours le même).

comments powered by Disqus