Answers:
目前尚无法解决,请参阅https://forums.aws.amazon.com/thread.jspa?threadID=162252,以获取有关此内容的讨论。
编辑:Lambda @ Edge使其成为可能,请参见下文。
有关此的更新...
现在可以通过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);
};
为了增加安德鲁的答案:
我已经尝试过了,并做了几点说明:不再有特定的Edge nodejs运行时,但是lambda需要在N Virginia地区创建,并由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" } ];
正确,由于Lambda @ Edge通常可用,因此将其限制在N Virginia,并且必须选择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函数。