Можно ли установить заголовки HSTS в раздаче Amazon CloudFront из источника S3?
Новости об этом ...
Заголовки ответа HTTP теперь можно настраивать с помощью функций Lambda @ edge. Посмотри пожалуйста http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html для документации. Чтобы попробовать это, создайте новую лямбда-функцию в консоли AWS. Выберите язык Edge Nodge.js 4.3 и найдите шаблон заголовка cloudfront-modify-response-header. Если вы это сделаете, Lambda спросит вас, к какому распределению и событию CloudFront применить эту функцию. Обратите внимание, что вы можете отредактировать или изменить это в любое время, перейдя на вкладку поведения Cloudfront.
Вот пример лямбда-функции ...
'use strict';
exports.handler = (event, context, callback) => {
const response = event.Records[0].cf.response;
response.headers['Strict-Transport-Security'] = 'max-age=2592000; includeSubDomains';
callback(null, response);
};
В настоящее время это невозможно, см. https://forums.aws.amazon.com/thread.jspa?threadID=162252 для обсуждения этого.
Изменить: Lambda @ Edge сделала это возможным, см. Ниже.
Чтобы добавить к ответу Эндрю:
Я только что попробовал это и пару примечаний: больше нет конкретной среды выполнения Edge nodejs, но лямбда должна быть создана в регионе Северная Вирджиния и запущена облачным фронтом происхождение-ответ или зритель-ответ.
Код из коробки, похоже, больше не работает. Это дает ERR_CONTENT_DECODING_FAILED.
Решение - использовать синтаксис json следующим образом:
response.headers['Strict-Transport-Security'] = [ { key: 'Strict-Transport-Security', value: "max-age=31536000; includeSubdomains; preload" } ];
response.headers['X-Content-Type-Options'] = [ { key: 'X-Content-Type-Options', value: "nosniff" } ];
Правильно, поскольку Lambda @ Edge обычно доступен, они ограничили его N Вирджиния, и нужно выбрать Node 6.10, а не Node 4.3.
Соответствующая часть нашего кода ниже (для нашей цели это всегда будет постоянное перенаправление 302):
'use strict';
exports.handler = (event, context, callback) => {
var request = event.Records[0].cf.request;
const response = {
status: '302',
statusDescription: '302 Found',
httpVersion: request.httpVersion,
headers: {
Location: [
{
"key":"Location",
"value":"someURL"
}
],
'Strict-Transport-Security': [
{
"key":"Strict-Transport-Security",
"value":'max-age=63072000; includeSubDomains; preload'
}
],
},
};
callback(null, response);
};
Настраивая различные варианты поведения в CloudFront, вы можете ограничить количество запросов, вызывающих функцию Lambda.