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 файл вручную. Тогда все работает до конца дня. На следующий день у меня опять проблема.
Что здесь происходит?
Ответы
Ответ 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 не нужно будет передавать файл всего содержимого из источника. Это может ускорить время отклика, особенно для больших файлов.