Cachera? Cachera pas? Comment résoudre vos problèmes de cache (navigateur, proxy) avec cake?

Tagged:


A force de cacher du contenu dans tous les sens, que ce soit au niveau du code, du server, du proxy et/ou du navigateur, on finit par ne plus très bien savoir qui fait quoi et surtout, en tant que développeur, pourquoi la page ne s'affiche pas correctement. Alors comment reprendre le controle du cache?

Controller::disableCache

Avant tout, il est sans doute utile de faire une petite piqure de rappel pour comprendre comment fonctionnent les choses et ce que préconisent les standards.

Par experience, notre application cake fonctionnait parfaitement sans se poser ce genre de questions jusqu'au jour où elle a été utilisée derrière un proxy d'entreprise: et la, c'est le drame... problème d'affichage des messages de session, navigation impossible. Résultat: obligation de rafraichir constamment la page à coup de F5.

Une simple fonction dans le controlleur permet de résoudre tous ces problèmes:disableCache. Si vous êtes encore en 1.1 (comme moi), vous pouvez toujours la recopier dans votre AppController.

function disableCache() {
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
}

Cette fonction remplit le header du message HTTP pour indiquer que la page ne peut pas être cachée. D'ailleurs, toutes les excuses sont bonnes : page expirée (avec Expires:, Last-Modified:), interdiction explicite de cacher (avec Cache-Control: no-store, no-cache, Pragma: no-cache)...

Astuce: Pb de cache de javascript sous IE

Vous pouvez également profiter de l'astuce inutile du jour. Nous avions un problème de cache pour un fichier javascript avec IE. En effet, celui ci contenait des données dynamiques. A l'époque, notre stratégie, sans doute inutile compte tenu de la remarque du paragraphe précédent, a été d'ajouter à l'url du javascript un paramètre aléatoire histoire qu'il ne puisse jamais tomber deux fois sur la même page et donc cacher la page. Bref une autre rustine simple mais efficace à un problème ponctuel de cache.