AWS cloudfront 在不使用 Lambda@Edge 的情况下添加自定义标头

Ali*_*slo 1 amazon-s3 custom-headers amazon-cloudfront

我想将x-frame-options作为同源添加到在S3存储桶上为我的应用程序提供服务的AWS CloudFront服务。

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

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

CloudFront Distributions -> My Distribution settings -> Origins and Origin Groups -> S3 Content item that代表我的应用程序 -> add Origin Custom Headers -> Header name: x-frame-options , Value : sameorigin

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

在此处输入图片说明

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

Dun*_*dan 8

您正在配置的“源自定义标头”不是添加到来自源的响应中的标头,而是添加到向源发出的请求中。从CloudFront 文档

您可以将 CloudFront 配置为向其发送到您的源的请求添加自定义标头。这些自定义标头使您能够从您的来源发送和收集您在典型查看器请求中无法获得的信息。这些标题甚至可以为每个来源定制。CloudFront 支持自定义和 Amazon S3 源的自定义标头。

所以这不是添加响应头的选项。虽然存在使用 S3 元数据来影响返回给查看器的标头的可能性,但这仅适用于Content-Type-header,因此这既不是一种选择。

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

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

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


ala*_*10n 6

截至 2021 年 11 月,Cloudfront 现在支持响应标头策略。这允许您将策略与您的发行版关联起来,该发行版定义了要返回的其他响应标头。如果您不想使用完整的安全标头预设策略,您可以仅使用x-frame-options.


dis*_*xan 5

这个 SO 答案帮助了我,但我首先发现了这个问题,所以也在这里分享答案。

您现在可以通过CloudFront 函数设置标头,而不必创建 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;
}
Run Code Online (Sandbox Code Playgroud)