Quelle est la meilleure façon de mettre à jour les URL CSS et JS?

26

Conformément aux meilleures pratiques de Yahoo pour accélérer votre site , nous fournissons du contenu statique à partir d'un CDN en utilisant des en-têtes d'expiration de cache très futurs. Bien sûr, nous devons occasionnellement mettre à jour ces fichiers "statiques", nous ajoutons donc actuellement une version infixe dans le nom de fichier (basée sur la somme SHA1 du contenu du fichier). Ainsi:

styles.min.css

Devient:

styles.min.abcd1234.css

Cependant, la gestion des fichiers versionnés peut devenir fastidieuse, et je me demandais si une notation d'argument GET pourrait être plus propre et meilleure:

styles.min.css?v=abcd1234

Lequel utilisez-vous et pourquoi? Y a-t-il des considérations liées au navigateur ou au proxy / cache que je devrais considérer?

David Eyk
la source
La raison pour laquelle je demande est que je me souviens avoir entendu une raison de NE PAS utiliser le style d'argument GET, mais je ne me souviens pas pourquoi.
David Eyk
L'utilisation de l'argument GET ne nécessite-t-elle pas de servir la feuille de style avec une sorte de script côté serveur (et ce ne serait plus statique)?
Lotus Notes
@Lotus: Vous pouvez envoyer les arguments GET et ils seront ignorés en silence si rien ne les recherche.
David Eyk

Réponses:

10

Selon Make the Web Faster de Google , les pages avec des paramètres de requête ne sont pas mises en cache par de nombreux proxy HTTP.

La plupart des serveurs proxy, notamment Squid jusqu'à la version 3.0, ne mettent pas en cache les ressources avec un "?" dans leur URL même si un en- Cache-control: publictête est présent dans la réponse. Pour activer la mise en cache du proxy pour ces ressources, supprimez les chaînes de requête des références aux ressources statiques et codez plutôt les paramètres dans les noms de fichiers eux-mêmes.

C'est styles.min.abcd1234.cssla solution préférée. Vous pouvez utiliser un mécanisme de réécriture d'URL approprié pour styles.min.abcd1234.cssdevenir le plus facile à implémenter de manière styles.min.css?v=abcd1234transparente.

Si vous ne prenez en charge que HTTPS, ce conseil ne s'applique pas, car les mandataires ne peuvent normalement pas mettre en cache les pages qui sont servies via SSL.

Jusqu'à Ulen
la source
2
Je me demande si les informations concernant la mise en cache des chaînes de requête et les serveurs proxy sont un peu datées? Les documents de Google ne font plus référence aux chaînes de requête et aux serveurs proxy dans ce contexte. Bien que les exemples impliquent toujours de changer le nom du fichier lui-même. Squid 2.7 (2008) et 3.1 (2010) prendraient apparemment en charge la mise en cache des chaînes de requête par défaut, et des versions antérieures pourraient être configurées pour prendre en charge cela.
MrWhite
15

En utilisant le versioning de style GET, à partir d'un cache vide, plusieurs URL - par exemple style.css?v=123et style.css?v=456- retourneraient le même contenu. Cependant, je ne vois pas que ce serait problématique, d'autant plus que vous ne lieriez qu'un seul à la fois.

Je pense que vous trouverez le style GET beaucoup plus facile à entretenir. Vous n'avez pas besoin de fichiers séparés: changez simplement l'URL et les navigateurs récupéreront le CSS à nouveau.

MISE À JOUR: sur des recherches supplémentaires, il semble que l'utilisation d'une chaîne de requête peut empêcher les navigateurs de mettre en cache les fichiers. Cependant, si vous renvoyez des en-têtes appropriés tels que Expirescelui-ci, ce n'est pas un problème.

MISE À JOUR 2: la réponse acceptée souligne que certains mandataires ne mettent pas en cache les fichiers avec une chaîne de requête. Cependant, cela est basé sur des informations anciennes; le problème particulier qu'ils mentionnent dans Squid a été corrigé il y a 7 ans. Impressive Webs a fait un bon article à ce sujet.

Chèvre mécontente
la source
C'est la mise en garde dont j'essayais de me souvenir. Merci pour le lien.
David Eyk
1

Les deux fonctionneront également bien car une chaîne de requête est considérée comme faisant partie de l'URL et en la modifiant, vous modifiez en fait le nom de la ressource, ce qui oblige le navigateur à récupérer une nouvelle copie du fichier.

Je dis utiliser la méthode la plus facile à entretenir.

John Conde
la source
0

ce n'est pas une réponse à la question ci-dessus , je veux une meilleure solution donc je me pose ici la question

Les deux méthodes nécessiteraient une modification des fichiers dans lesquels les fichiers css et js sont référencés. En effet, cela nécessiterait un redémarrage du serveur d'applications après avoir effectué les modifications.

Existe-t-il un meilleur moyen de gérer les versions des fichiers statiques sans avoir à redémarrer le serveur d'applications?

ce qui suit est exclu dans la solution

  • modification des noms de fichiers css et js
  • passer un paramètre de requête dans l'url

la solution ne doit pas non plus affecter la définition du contrôle du cache ou expire.

Merci

Santhosh S
la source
1
on dirait que vous êtes nouveau ici. C'est une bonne question. Vous devriez le poster en tant que tel, peut-être en renvoyant à cette question pour référence. J'ai signalé cela à l'attention du modérateur afin qu'ils puissent vous aider.
David Eyk
comme l'a souligné David, ce site n'est pas comme les autres sites du forum. Si vous avez une nouvelle question à poser, n'hésitez pas à cliquer sur le bouton "poser une question"
Mark Henderson
Ceci est une clarification utile. Si vous modifiez votre feuille de style, il serait préférable de conserver le nom et la référence identiques, plutôt que de mettre à jour des centaines de références sur le site.
Mark Stosberg