web-dev-qa-db-fra.com

Amazon Cloudfront Cache-Control: l'en-tête sans cache n'a aucun effet après 24 heures

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:

  • index.html (Cache-Control: pas de cache)
  • app.js (Cache-Control: max-age = 63072000, public)
  • style.css (Cache-Control: max-age = 63072000, public)

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?

26
Adam

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.

42
dcro