来自S3起源的Amazon CloudFront上的HSTS

是否可以在S3来源的Amazon CloudFront分配上设置HSTS标头?

这个更新…

现在可以通过Lambda @ edge函数自定义HTTP响应头。 有关文档,请参阅http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html 。 要尝试此操作,请在AWS控制台中创build一个新的lambda函数。 select语言“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); }; 

要添加到安德鲁的答案:

我刚刚尝试过这一点,还有一些注意事项:不再有特定的边缘nodejs运行时,但lambda需要在N弗吉尼亚州地区创build,并由云端原点响应查看器响应触发。

开箱即用的代码似乎不再工作。 它给出了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弗吉尼亚州,并且必须select节点6.10而不是节点4.3。

我们下面的代码的相关部分(对于我们的目的,这将永远是一个302永久redirect):

 '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上configuration不同的行为,可以限制哪些请求将调用Lambda函数。