Pour certains projets, il est nécessaire qu'un fichier particulier intégré dans une page web ne soit pas mis en cache par le navigateur du visiteur. Les exemples les plus parlants sont :
- un fichier css, js ou flash que l'on a modifié, qui doit obligatoirement remplacer l'ancien.
- une image qui porte toujours le même nom de fichier mais qui change tous les jours (par exemple les modules « photo du jour »)
Il y a bien la méthode de la balise meta « pragma no-cache », mais son efficacité varie en fonction du navigateur. La seule façon fiable d'éviter un cache est en faite toute bête, il suffit de rajouter des arguments derrière l'extension du fichier ! En plus de fonctionner partout, elle permet une gestion précise du cache. Contrairement aux balises META et autres options du Header (cf améliorer les temps de chargement d'un site), vous n'empêchez la mise en cache que de l'élément voulu, et non de la totalité de ses éléments.
Quelques exemples pour mieux comprendre
<link rel="stylesheet" href="style.css" type="text/css" media="screen" />
Voici l'appel classique d'une feuille de style, dans ce cas le fichier style.css est mis en cache par le navigateur. Si la page est rechargée, le fichier ne sera pas téléchargé. Imaginons que vous mettiez à jour ce fichier, il faudrait attendre que le navigateur décide de vérifier la validité de son cache, ce qui varie énormément en fonction du navigateur.
href="style.css?1"
En rajoutant simplement "?1" vous ciblez toujours le même fichier (style.css) sur votre serveur, mais les navigateurs considéreront que « style.css » et « style.css?1″ sont 2 fichiers obligatoirement différents et créera donc un cache pour ce nouveau fichier.
Ainsi, vous ne forcez la mise à jour du cache que lorsque vous le souhaitez ! Les avantages sans les inconvénients !
Voici les exemples pour divers formats :
<img src="toto.jpg?1" alt="toto" />
<script type="text/javascript" src="/site.js?1"></script>
<object data="monflash.swf?1" width="300"height="120"></object>
Vous n'êtes pas obligé de mettre des numéros, mais ils ont l'avantage de ne pas trop rallonger l'url et de pouvoir être incrémenter facilement (?1 puis une mise à jour => ?2 etc).
Pour empêcher complètement la mise en cache d'un fichier, la fonction php mktime() est votre ami ! Le nombre qu'elle retourne correspond au nombre de secondes qui se sont écoulées depuis le 1er Janvier 1970. Ce nombre change donc toutes les secondes ... Exemple d'utilisation :
<img src="toto.png?<?= mktime(); ?>" alt="" />
Ce qui nous donnera quelque chose comme : <img src="toto.png?1290884333" alt="" /> et sera différent à chaque seconde sans jamais pouvoir être identique à une ancienne version.
Au passage, <?= $toto ?> est la forme courte de <? echo $toto ?>.