Salut,

Un soucis me bloque dans la mise en place de mod_expires sur mon serveur où j'héberge mon site développé avec Symfony 2. Je pense ne pas être le premier à être confronté au problème, et pourtant j'ai beaucoup de mal à trouver une réponse sur le web. C'est pourquoi je m'en remets à vous.

Je m'explique ! D'après ce que j'ai compris, le fait de mettre en place mod_expires ainsi qu'une durée assez longue de mise en cache de mes ressources CSS et JS m'oblige à renommer mes ressources à chaque fois que je les modifie, pour que le navigateur comprenne que le fichier est nouveau.

Du coup j'ai fais quelques recherches, et je suis tombé sur cette config apache qui permet, peu importe le nom d'une ressource (par exemple main.01234.css), de rerouter la requête vers un fichier bien spécifique (main.css, pour reprendre l'exemple).

Ca m'arrange, mais reste un problème : je n'ai pas envie d'aller dans chaque <link>, chaque <script> et j'en passe, renommer mes ressources qui ont changé. Je me demande donc si il existe une technique pour renommer automatiquement toutes ou partie de mes ressources lorsque je fais une mise en prod, afin que les changements que j'ai effectués soient répercutés directement chez tous mes visiteurs, et pas seulement lorsque leur cache arrive à expiration.

Je précise que mon rythme de modification de mes CSS et mes JS est tout à fait aléatoire. Je peux faire 10 modifications que je déploie en production en une journée, tout comme 2 en un mois... Aucune règle à ce niveau. Je cherche donc juste à mettre en place, dans le meilleur des mondes, une commande Symfony qui renommerait dans mes templates les ressources que j'inclue. Mais je n'ai absolument aucun point de départ pour le moment.

Est-ce que vous pourriez m'aider ? :)
Bien à vous !

6 réponses


Bonjour,
peut-etre faire un fichier/fonction qui retourne un tableau qui contient tout tes fichiers et ainsi récupérer dynamiquement les donnée dans les balises link/script?

Oui pourquoi pas dans un premier temps, mais il faudrait ensuite pourquoi réinjecter les noms des fichiers, mis à jour avec une partie unique, dans les différents templates, aux bons endroits. Tu as une idée pour parcourir tous les templates et récupérer les balises <link>, <img> et <script> ?

Je ne suis pas sur de comprendre ton probleme si tu fais quelquechose du genre

<link href="{{ assets.getStylesheet({name:'main'}) }}" rel="stylesheet">

et que ta fonction va chercher le lien dans un tableau du genre

array(
    // ...
    'main' => 'main.01234.css',
);

tu n'as plus besoin de toucher au templates, il te suffit juste de modifier le nom dans le tableau. (Désolé pour la syntaxe du twig je ne suis pas habitué ^^ )

Ah oui j'avais compris ton idée à l'envers en fait. Ca me semble être une bonne idée, je vais creuser ça. Je te dirais ce que ça a donné ;)

Merci !

Si tu rajoutes l'option must-revalidate à Cache-Control, le client va vérifier que la ressource n'a pas été modifiée avec un if-modified-since.
C'est comme ça que je procède

Cache-Control: max-age=31536000 ; must-revalidate

Ah, très interressant ça. Merci beaucoup je vais tester ça.

Edit : je pense que ceci se rapproche fortement de ce que je cherche à faire. Remplacer le numéro de version par un paramètre dans parameters.yml puis faire en sorte d'automatiser la montée en version en faisant une commande qui fait +1 sur ce paramètre me parait jouable. Qu'en pensez-vous ?