Мы только что перешли на Amazon AWS. В настоящее время у нас есть экземпляр EC2, который работает хорошо. Он запускает Nginx спереди и Apache на сервере. Это тоже хорошо работает. Все сайты запускаются правильно и включают заголовок Cache-Control для файлов, которые обслуживаются из EC2.
Проблема во ВСЕХ статических файлах, которые мы поместили в Amazon S3 доступ к которому осуществляется через CloudFront CDN. Мы можем получить доступ к файлам нормально (и без проблем с CORS), но, очевидно, CloudFront не обслуживает файлы с заголовком Cache-Control. Мы хотим использовать кеширование браузера.
На мой взгляд, экземпляр EC2 не играет здесь роли, поскольку статические файлы обслуживаются непосредственно S3 + CloudFront, запрос не отправляется на веб-сервер в EC2.
Я совершенно заблудился.
Вопрос: 1) Как в этом случае установить Cache-Control? 2) Можно ли настроить Cache-Control? С S3 или CloudFront?
Примечание. Я нашел несколько страниц в Google, где вы можете установить заголовок в S3 для отдельных объектов. Это действительно не продуктивный способ сделать это, особенно, поскольку в моем случае мы говорим о нескольких объектах.
Спасибо!
Я нашел несколько страниц в Google, где вы можете установить заголовок в S3 для отдельных объектов. Это действительно непродуктивный способ сделать это, особенно, поскольку в моем случае мы говорим о нескольких объектах.
Что ж, «продуктивно» или нет, именно так оно и задумано на самом деле.
CloudFront не Добавить Cache-Control:
заголовки.
CloudFront проходит через (а также уважает, если не указано иное) то Cache-Control:
заголовки, предоставленные исходным сервером, которым в данном случае является S3.
Получить Cache-Control:
заголовки, предоставляемые S3 при извлечении объекта, они должны быть предоставлены при загрузке объекта в S3 или добавлены к метаданным объекта с помощью последующей операции put + copy, которая может использоваться для внутреннего копирования объекта в себя в S3, изменение метаданных в процессе. Это то, что делает консоль за кулисами, если вы редактируете метаданные объекта.
Также (на случай, если вам интересно) нет глобальной настройки в S3, чтобы заставить все объекты в корзине возвращать эти заголовки - это атрибут для каждого объекта.
Обновить: Lambda @ Edge - новая функция в CloudFront который позволяет запускать триггеры для запросов и / или ответов, между средством просмотра и кешем и / или кешем и источником, выполняя код, написанный на Node.js, для простой структуры объекта запроса / ответа, предоставляемой CloudFront.
Одно из основных приложений для этой функции - манипулирование заголовками ... поэтому, хотя приведенное выше все еще верно - сам CloudFront не добавляет Cache-Control
- теперь функция Lambda может добавлять их в ответ, возвращаемый CloudFront.
Этот пример добавляет Cache-Control: public, max-age=86400
только если нет Cache-Control
заголовок уже присутствует в ответе.
Использование этого кода в триггере ответа источника приведет к его срабатыванию каждый раз, когда CloudFront извлекает объект из источника, и изменению ответа до его кэширования CloudFront.
'use strict';
exports.handler = (event, context, callback) => {
const response = event.Records[0].cf.response;
if(!response.headers['cache-control'])
{
response.headers['cache-control'] = [{
key: 'Cache-Control',
value: 'public, max-age=86400'
}];
}
callback(null, response);
};
Обновить (20.06.2018): Недавно я отправил в команду CloudFront запрос функции, чтобы разрешить настройку статического происхождения ответ заголовки как атрибуты происхождения, аналогично статическому запрос заголовки могут быть добавлены, теперь ... но с поворотом, позволяющим настраивать каждый заголовок для добавления условно (только если источник не предоставил этот заголовок в ответе) или безусловно (добавление заголовка и перезапись заголовка из затем происхождение, если оно есть).
С запросами функций вы обычно не получаете никакого подтверждения того, действительно ли они рассматривают возможность внедрения новой функции ... или даже, возможно, они уже работали над ней ... это просто объявляется, когда они будут выполнены. Так что я понятия не имею, будут ли они реализованы. Есть аргумент, что, поскольку эта возможность уже доступна через Lambda @ Edge, она не нужна в базовой функциональности ... но мой контраргумент заключается в том, что функционально базовая функция не является полной без возможности выполнять простые манипуляции с заголовком статического ответа, и что, если это единственная причина, по которой необходим триггер, то необходимость в лямбда-триггерах является ненужными затратами с финансовой точки зрения и дополнительной задержкой (хотя ни то, ни другое не обязательно является чрезмерной стоимостью).