出于速度和成本原因,我公司的网站有一个静态主页。我们使用 S3 作为 CloudFront 的来源。现在,我们想为整个域声明 Strict-Transport-Security,但 S3 似乎不会发送我们指定的任何标头(除了以 x-aws-- 开头的标头)。CloudFront 似乎也没有任何自定义标头选项。
这可能吗?
答案1
您现在可以在 CloudFront 中原生添加 HTTP 响应标头(包括 HSTS),而无需修改源或编写函数。使用您的配置创建新的响应标头策略,然后将该策略附加到一个或多个缓存行为。
文档可在此处获取: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/adding-response-headers.html
答案2
David 的回答指出文档,归结为:
- 创建一个 Lambda 函数,如下所示。请注意 Lambda@Edge运行时间有限与其他 Lambda 函数相比,还有一些额外的限制。例如,所有函数都必须在 - CloudFront 中创建
us-east-1
- CloudFront 将自动将它们复制到其他区域 - 不支持层,并且所有触发器都必须使用显式 ARN - 没有别名,或者使用$LATEST
。
'use strict';
exports.handler = (event, context, callback) => {
const response = event.Records[0].cf.response;
const headers = response.headers;
headers['strict-transport-security'] = [{
key: 'Strict-Transport-Security',
/*
* verify that max-age and 'includeSubdomains' are the settings you want
*/
value: 'max-age=31536000; includeSubdomains; preload'
}];
callback(null, response);
};
- 发布版本并将其部署到 Lambda@Edge。
$LATEST
下一步不能使用或别名。 - 将已发布的函数版本与 CloudFront 分发版关联。如果这是一次性任务,那么这样做可能更容易通过 Lambda 控制台如果你想将你的函数与多个分布关联起来,使用CloudFront 控制台。
您需要将事件类型设置为
origin-response
(S3 和缓存之间)或viewer-response
(缓存和浏览器之间),并使用您上面发布的版本指定 ARN - 例如arn:aws:lambda:us-east-1:1234567890:function:MY-FUNCTION-NAME:v1
等待分发更新并测试标头是否存在于响应中
答案3
自 2017 年 7 月 16 日起,您所需的功能可通过 Lambda@Edge 获得,请参阅http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html请参阅一般文档或特定示例https://nvisium.com/blog/2017/08/10/lambda-edge-cloudfront-custom-headers/