Фон
Я размещаю статический сайт на S3, с CloudFront сверху. У меня проблема с моими файлами HTML.
Согласно FAQ CloudFront :
Amazon CloudFront использует эти заголовки элементов управления кэшем, чтобы определить, как часто необходимо проверять источник обновленной версии этого файла.
Что я сделал до сих пор
Имея это в виду, я установил HTML-файлы в моем S3 Bucket, чтобы добавить следующие заголовки:
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Expires: Fri, 01 Jan 1990 00:00:00 GMT
При моем первом обращении к my samplefile.htm
я вижу следующие заголовки ответа (я исключил очевидные заголовки (например Content-Type
), чтобы не потерять смысл:
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Date:Sat, 10 Dec 2011 14:16:51 GMT
ETag:"a5890ace30a3e84d9118196c161aeec2"
Expires:Fri, 01 Jan 1990 00:00:00 GMT
Last-Modified:Sat, 10 Dec 2011 14:16:43 GMT
Server:AmazonS3
X-Cache:Miss from cloudfront
Как видите, мой Cache-Control
заголовок там. Проблема в том, что если я обновляю этот файл и обновляю его, я получаю кэшированное содержимое (а не последний файл) и вижу, что CloudFront обслуживает свою кэшированную версию, просматривая заголовки ответа:
X-Cache:Hit from cloudfront
Резюме / вопрос
Имея в виду вышеизложенное, как я могу добиться автоматического получения последней версии HTML при использовании CloudFront?
Согласно FAQ, я должен быть в состоянии сделать это с заголовками Cache-Control, но я не могу заставить это работать.
Следуя ответам ниже
В конце концов я решил изменить свой www CNAME, чтобы он указывал на мое ведро S3 напрямую. Затем добавлен новый CNAME под названием «static», который указывает на CloudFront.
Это означает, что HTML является прямым из S3, который затем имеет все свои ссылки CSS / JS / IMG, указывающие на static.mydomain.com
The minimum expiration time CloudFront supports is 0 seconds for web distributions and 3600 seconds for RTMP distributions.
docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/…Я полагаю, что ответы, хотя и правильные в то время, теперь устарели, поскольку Cloudfront теперь поддерживает минимальный TTL 0, и первоначальная попытка OP использовать cache-age = 0 теперь должна работать.
Возможно, вы захотите выяснить, использовать ли эти другие заголовки управления кэшем с точки зрения того, будут ли они давать результат, который вы ищете - вам может понадобиться только максимальный возраст. Вероятно, вы хотите, чтобы Cloudfront проверил S3, чтобы увидеть, изменился ли HTML-файл. Если это так, Cloudfront может получить и вернуть новый файл. Если нет, он может обслуживать клиента из его существующего кэша (сохраняя пропускную способность S3 и обслуживая клиента быстрее и более локально).
Цель Cloudfront - обслуживать кэшированный контент, да, но теперь это включает контент, который иногда изменяется, но может быть кэширован, если он не изменился.
Строки запроса Ps теперь также работают с Cloudfront (если вы настраиваете «поведение» для соответствующего источника - еще одна новая функция), однако некоторые прокси-серверы могут все еще не кэшировать любые файлы со строками запроса.
Руководство разработчика Amazon: срок действия 1
источник
Не уверен, как CloudFront обрабатывает заголовок так же, как у вас, но если вы не укажете заголовки, по умолчанию время обновления объектов составляет 24 часа.
Одна из вещей, которую вы можете сделать, чтобы обновить объекты, - сделать содержимое недействительным. Проверьте ссылку ниже для получения дополнительной информации. http://blog.cloudberrylab.com/2010/08/how-to-manage-cloudfront-object.html
источник