J'héberge un site Web statique dans S3 et j'utilise Cloudfront pour mettre en cache des fichiers. J'ai essentiellement 3 fichiers avec les en-têtes suivants:
Mon fichier html utilise des paramètres de chaîne de requête qui sont mis à jour chaque fois que je mets à jour mes fichiers css ou js. J'ai configuré s3 pour transmettre ces paramètres et j'ai vérifié qu'il fonctionne pour invalider les ressources mises en cache. Mon fichier index.html ressemble à ceci:
<html>
<head>
...
<link rel="stylesheet" href="app.css?v=14113e2c764">
</head>
<body>
...
<script src="app.js?v=14113e2c764"></script>
</body>
</html>
Cela semble très bien fonctionner car je pousse les mises à jour toute la journée, mais quand je viens le lendemain matin et que je pousse mon prochain changement, le fichier index.html est obsolète. Au lieu d'avoir le bon paramètre? V =, il a l'ancien! La seule façon de le corriger est d'invalider le fichier html manuellement. Ensuite, tout fonctionne pour le reste de la journée. Le lendemain, j'ai à nouveau le même problème.
Que se passe t-il ici?
Vérifiez que la distribution CloudFront Minimum TTL
est défini sur 0. S'il est défini sur une autre valeur, CloudFront ne respectera pas no-cache
en-tête et mettra toujours en cache le fichier pour le Minimum TTL
. Plus de détails sur les directives de mise en cache peuvent être trouvés ici:
http://docs.aws.Amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html
Si cela n'aide pas, essayez de déboguer la requête HTTP réelle pour index.html
et postez les en-têtes de réponse ici afin que nous puissions les consulter.
De plus, au lieu d'utiliser no-cache
pour le fichier index.html, vous pouvez essayer d'utiliser
public, must-revalidate, proxy-revalidate, max-age=0
Cela permettra à CloudFront de stocker le fichier sur l'emplacement Edge, mais il le forcera à le revalider avec l'origine à chaque demande. Si le fichier n'a pas changé, CloudFront n'aura pas besoin de transférer l'intégralité du contenu du fichier depuis l'origine. Cela peut accélérer le temps de réponse, en particulier pour les fichiers plus volumineux.