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


27

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

Благодарность!


Пожалуйста, опубликуйте URL-адрес объекта в S3 и соответствующий URL-адрес CloudFront. Я хотел бы увидеть поведение, которое вы описываете себя. Поочередно публикуйте CURL для обоих, показывая заголовки.
Тим

Мне удалось добавить пользовательский заголовок «Истекает: Солнце, 15 октября 2027 13:46:07 GMT», отредактировав источник в console.aws.amazon.com/cloudfront/home . Однако это не похоже на работу. Как ты это сделал, наконец?
Маноло

Ответы:


31

Я попал на несколько страниц в 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);
};

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

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


Это все еще раздражает, хотя.
Эрика Кейн


1
Тада, действительно, @Kunal. Это пример того, что я упомянул в ответе как «добавленный к метаданным объекта с помощью последующей операции put + copy». Используйте это с осторожностью, и проверьте, потому что есть предостережения. Это сбросит все ваши метки даты и может иметь значение для шифрования. Он также может изменить etags объекта с multipart на формат с одной частью, что является другим алгоритмом, и может привести к путанице в любой системе, которая хранит etags где-либо еще для будущих проверок целостности. Если в корзине включено управление версиями, ваши затраты на хранение удваиваются, если вы не очистите старые версии.
Майкл - sqlbot

1
Новая служба Lambda @ Edge теперь также предоставляет механизм, который позволяет добавлять заголовки ответов Cache-Control (среди прочего) на лету. Я обновил ответ рабочим примером того, как это можно сделать.
Майкл - sqlbot

1
@Broshi «Политика доверия» роли должна содержать список служб lambda и edgelambda. Посмотрите на docs.aws.amazon.com/lambda/latest/dg/… .
Майкл - sqlbot
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.