Подтвердить что ты не робот

Amazon Cloudfront Cache-Control: заголовок без кэша не действует после 24 часов

Я размещаю статический веб-сайт в S3 и использую Cloudfront для кэширования файлов. У меня есть 3 файла со следующими заголовками:

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

В моем html файле используются параметры строки запроса, которые обновляются каждый раз, когда я обновляю файлы css или js. Я сконфигурировал s3 для передачи этих параметров, и я проверил, что он работает, чтобы аннулировать кешированные ресурсы. Мой файл index.html выглядит примерно так:

<html>
    <head>
        ...
        <link rel="stylesheet" href="app.css?v=14113e2c764">
    </head>
    <body>
        ...
        <script src="app.js?v=14113e2c764"></script>
    </body>
</html>

Кажется, он отлично работает, когда я нажимаю обновления весь день, но когда я нахожусь на следующее утро и нажимаю свое следующее изменение, файл index.html устарел. Вместо того, чтобы иметь правильный параметр v =, он имеет старый! Единственный способ исправить это - аннулировать html файл вручную. Тогда все работает до конца дня. На следующий день у меня опять проблема.

Что здесь происходит?

4b9b3361

Ответ 1

Убедитесь, что для дистрибутива CloudFront Minimum TTL установлено значение 0. Если он установлен на любое другое значение, CloudFront не будет уважать заголовок no-cache и будет кэшировать файл для Minimum TTL. Более подробную информацию о директивах кэширования можно найти здесь:

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html

Если это не помогает, попробуйте отлаживать фактический HTTP-запрос для index.html и размещать заголовки ответов здесь, чтобы мы могли посмотреть на них.

Кроме того, вместо no-cache для файла index.html вы можете попробовать использовать

public, must-revalidate, proxy-revalidate, max-age=0

Это позволит CloudFront хранить файл в местоположении края, но он заставит его повторить его с началом с каждым запросом. Если файл не изменился, CloudFront не нужно будет передавать файл всего содержимого из источника. Это может ускорить время отклика, особенно для больших файлов.