Вопрос: Нет заголовка Cache-Control для файлов из AWS CloudFront с S3 Origin


Мы просто мигрировали на 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 для отдельных объектов. Это действительно не эффективный способ сделать это специально, поскольку в моем случае мы говорим о нескольких объектах.

Благодаря!


20
2018-04-14 12:32


Источник


Укажите URL-адрес для объекта в S3 и соответствующий URL-адрес CloudFront. Я бы хотел посмотреть, как вы себя описываете. Альтернативно отправляйте CURL для обоих, показывая заголовки. - Tim
Я смог добавить пользовательский заголовок «Expires: Sun, 15 Oct 2027 13:46:07 GMT», отредактировав начало в console.aws.amazon.com/cloudfront/home, Однако это не работает. Как вы это сделали? - Manolo


Ответы:


Я ударил несколько страниц в Google, где вы можете установить заголовок в S3 для отдельных объектов. Это действительно не эффективный способ сделать это специально, поскольку в моем случае мы говорим о нескольких объектах.

Ну, «продуктивно» или нет, вот как он на самом деле предназначен для работы.

CloudFront не Добавить  Cache-Control: заголовки.

CloudFront проходит через  (а также соблюдает, если не указано иное)  Cache-Control: которые предоставляются сервером происхождения, который в этом случае является S3.

Получить Cache-Control: заголовки, предоставленные S3, когда объект извлекается, они должны быть предоставлены, когда объект загружен в S3 или добавлен в метаданные объекта последующей операцией put + copy, которая может быть использована для внутренней копии объекта в себя в S3, изменяя метаданные в процессе. Это то, что консоль делает за кулисами, если вы редактируете метаданные объекта.

Существует также (в случае, если вам интересно), глобальная настройка в S3 не заставит все объекты в ведре возвращать эти заголовки - это атрибут per-object.


Обновить:  Lambda @ Edge - новая функция в CloudFront который позволяет запускать триггеры с запросами и / или ответами между зрителем и кешем и / или кешем и источником, запуская код, написанный в Node.js, против простой структуры объекта запроса / ответа, открытой CloudFront.

Одним из основных приложений для этой функции является манипулирование заголовками ... так что, хотя выше все еще точно - CloudFront сам по себе не добавляет Cache-Control - теперь функция Lambda может добавить их в ответ, который возвращается из CloudFront.

Этот пример добавляет Cache-Control: public, max-age=86400 только если нет Cache-Controlзаголовок уже присутствует в ответе.

Использование этого кода в триггере Origin Response приведет к его срабатыванию каждый раз, когда 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);
};

Обновить (2018-06-20): Недавно я отправил запрос функции команде CloudFront, чтобы разрешить конфигурацию статического происхождения ответ заголовки как атрибуты происхождения, аналогичные тому, как статические запрос теперь могут быть добавлены заголовки ... но с завихрением, позволяющим настраивать каждый заголовок условно (только если источник не предоставил этот заголовок в ответе) или безоговорочно (добавление заголовка и перезапись заголовка из затем происхождение, если оно имеется).

С запросами на функции вы обычно не получаете подтверждения о том, действительно ли они рассматривают возможность внедрения новой функции ... или даже если бы они уже работали над ней ... это просто объявлено, когда они будут выполнены. Поэтому я понятия не имею, будут ли они реализованы. Существует аргумент в пользу того, что, поскольку эта возможность уже доступна через Lambda @ Edge, в базовой функции нет необходимости ... но мой контраргумент заключается в том, что база функционально не является полнофункциональной, без возможности выполняйте простые, статические манипуляции заголовка ответа, и если это единственная причина, по которой необходим триггер, то требуемые триггеры лямбда - это ненужные затраты, в финансовом отношении и при добавленной задержке (хотя ни одна из них не является необычной стоимостью).


22
2018-04-15 00:49



Это все еще раздражает. - Erica Kane
stackoverflow.com/a/30225271/846727 - ТАДА !! - Kunal
Тада, действительно, @ Кунал. Это пример того, о чем я говорил в ответе, как "добавлен в метаданные объекта последующей операцией put + copy." Используйте его с осторожностью и испытанием, потому что есть оговорки. Он сбросит все ваши данные и может повлиять на шифрование. Он также может изменять объектные etags из формата multipart в формат отдельной части, который является другим алгоритмом и будет путать любую систему, которая сохранила этики в другом месте для будущих проверок целостности. Если управление версиями включено в ведро, стоимость хранения удваивается, если вы не очистите старые версии. - Michael - sqlbot
Новая служба Lambda @ Edge теперь также предоставляет механизм, который позволяет добавлять заголовки ответов Cache-Control (среди других), которые будут добавлены «на лету». Я обновил ответ с помощью рабочего примера того, как это можно сделать. - Michael - sqlbot
@Broshi «доверительная политика» роли должна содержать список услуг лямбды и edgelambda. Взгляни на docs.aws.amazon.com/lambda/latest/dg/..., - Michael - sqlbot