是否可以从 S3 来源在 Amazon CloudFront 分发上设置 HSTS 标头?
答案1
目前还不可能,请参阅https://forums.aws.amazon.com/thread.jspa?threadID=162252进行讨论。
编辑:Lambda@Edge 已使其成为可能,见下文。
答案2
关于此事的更新...
现在可以通过 Lambda@edge 函数自定义 HTTP 响应标头。请参阅http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html以获取文档。要尝试此操作,请在 AWS 控制台中创建一个新的 lambda 函数。选择“Edge Nodge.js 4.3”作为语言,然后查找 cloudfront-modify-response-header 模板。如果执行此操作,Lambda 将询问您将该函数应用于哪个 CloudFront 分发和事件。请注意,您可以随时通过转到 Cloudfront 行为选项卡来编辑或更改此设置。
这是一个 lambda 函数的示例...
'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);
};
答案3
补充安德鲁的回答:
我刚刚尝试了这个,并注意到了几点:不再有特定的边缘 nodejs 运行时,但需要在北弗吉尼亚地区创建 lambda 并由 cloudfront 触发起源-响应或者观者反应。
开箱即用的代码似乎不再起作用。它给出 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" } ];
答案4
正确,由于 Lambda@Edge 普遍可用,他们将其限制在北弗吉尼亚,并且必须选择 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 函数。