来自 S3 来源的 Amazon CloudFront 上的 HSTS

来自 S3 来源的 Amazon CloudFront 上的 HSTS

是否可以从 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 函数。

相关内容