【问题标题】:AWS cloudfront add custom header without using Lambda@EdgeAWS cloudfront 添加自定义标头而不使用 Lambda@Edge
【发布时间】:2020-04-08 16:34:52
【问题描述】:

我想将 x-frame-options 作为 sameorigin 添加到 AWS CloudFront 服务,该服务在 S3 桶。

我不想添加新的 Lambda 函数来编辑请求标头。

其实我在附件下面找到了一个地方:

CloudFront 分配 -> 我的分配设置 -> 源和源组 -> 代表我的应用程序的 S3 内容项 -> 添加源自定义标头 -> 标头名称:x-frame-options,值:同源

但是当部署完成时,S3 存储桶文件和 URL 的所有相关请求中仍然会出现旧标头。

如何在没有任何 Lambda 函数的情况下直接使用现有 AWS CloudFront 面板添加到标头?

【问题讨论】:

    标签: amazon-s3 amazon-cloudfront custom-headers


    【解决方案1】:

    您正在配置的“源自定义标头”不是添加到源响应的标头,而是添加到对源的请求的标头。来自CloudFront documentation

    您可以配置 CloudFront 以向请求添加自定义标头 它发送到您的来源。这些自定义标头使您能够发送 并从您的来源收集您无法获得的信息 典型的观众请求。这些标题甚至可以为每个 起源。 CloudFront 支持自定义标头和自定义标头 Amazon S3 起源。

    所以这不是添加响应标头的选项。虽然use S3 metadata 存在影响返回给查看器的标头的可能性,但这仅适用于Content-Type-标头,因此这不是一个选项。

    最好的选择是使用 Lambda@Edge 函数。虽然这听起来像是一个麻烦且昂贵的解决方案,但实际上并非如此。对于您的用例,该 Lambda@Edge 函数的代码可以很简单,如下所示:

    def lambda_handler(event, context):
        response = event["Records"][0]["cf"]["response"]
        response["headers"]["x-frame-options"] = ":sameorigin"
        return response
    

    当您将此 Lambda@Edge 函数配置为触发 CloudFront 中的“源响应”事件时,它不会针对每个查看器请求执行,而是仅在返回到查看器的内容未被 CloudFront 缓存并且必须首先从 S3 获取。这有助于最大限度地减少由执行 Lambda@Edge 函数引起的额外延迟和成本。

    【讨论】:

    • 感谢您的帮助,我很确定这一点,但在 Stackoverflow 开发人员的一些文档和 cmets 中,他们处理了这个问题,告诉您可以通过原始自定义标题添加,如图所示,但不幸的是它没有用。
    【解决方案2】:

    This SO answer 帮了我,但我首先找到了这个问题,所以也在这里分享答案。

    您现在可以通过 CloudFront Functions 设置标头,而不必创建 Lambda@Edge 函数。文档中提供的示例代码非常适合设置过时的浏览器安全性所需的标头:

    function handler(event) {
        var response = event.response;
        var headers = response.headers;
    
        // Set HTTP security headers
        // Since JavaScript doesn't allow for hyphens in variable names, we use the dict["key"] notation 
        headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; 
        headers['content-security-policy'] = { value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"}; 
        headers['x-content-type-options'] = { value: 'nosniff'}; 
        headers['x-frame-options'] = {value: 'DENY'}; 
        headers['x-xss-protection'] = {value: '1; mode=block'}; 
    
        // Return the response to viewers 
        return response;
    }
    

    【讨论】:

    • 感谢您的回答,我期待找到一种无需任何 Lambda 函数即可设置标头的方法,但正如您和@Dunedan 提到的那样,没有 Lambda 函数就没有办法,那么现在我正在使用 Lambda Edge在我的项目上。
    • Cloudfront 函数仅适用于 Viewer RequestViewer Response 事件。
    • @SaurishKar 是的,你是对的。这用于观众响应。
    【解决方案3】:

    截至 2021 年 11 月,Cloudfront 现在支持 Response Headers Policies。这允许您将策略与您的分配相关联,该分配定义要返回的其他响应标头。如果您不想使用完整的安全标头预设策略,可以仅使用 x-frame-options 创建自定义策略。

    【讨论】:

      猜你喜欢
      • 2018-06-17
      • 2019-02-04
      • 1970-01-01
      • 2019-08-21
      • 2022-01-01
      • 2018-07-27
      • 2021-11-09
      • 2023-04-05
      • 2012-04-08
      相关资源
      最近更新 更多