使用 CloudFront 发送自定义主机标头

使用 CloudFront 发送自定义主机标头

我有一个 ELB,我想将其放在 CloudFront 后面。假设 ELB 是 example.us-east-1.elb.amazonaws.com。它只接受 Host 标头设置为 www.example.com 的请求,我现在想将其托管在 CloudFront 中。是否可以告诉 CloudFront 使用此Host标头?当我尝试Host在 AWS 控制台中为 CloudFront 设置标头时,我收到错误消息com.amazonaws.services.cloudfront.model.InvalidArgumentException: The parameter HeaderName : Host is not allowed. (Service: AmazonCloudFront; Status Code: 400; Error Code: InvalidArgument; Request ID: dead-beef-badc0ffee1)

答案1

据推测,如果 ELB 上的服务仅响应,www.example.com那么这就是您要指向 CloudFront 的主机名——因此,您的解决方案很简单:在缓存行为设置中,将Host标头列入白名单以转发到原点。

在此配置中,CloudFront 会传递Host浏览器发送的标头,该标头必须添加到分发配置中的备用域名列表中。请求dzzzexample.cloudfront.net将失败,因为您的来源无法理解它们,但这通常是件好事,因为您不希望搜索引擎在 CDN 域名下索引您的内容。

但是,这可能不是您的计划。如果该配置不适用于您的应用程序,则需要 Lambda@Edge Origin Request 触发器来修改Host标头。

'use strict';

// force a specific Host header to be sent to the origin

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    request.headers.host[0].value = 'www.example.com';
    return callback(null, request);
};

请注意,Host除非您配置缓存行为以将标头列入白名单Host(如上所述),否则标头在源请求触发器中是不可变的。在这种情况下,您将HostLambda@Edge 触发器设置的标头列入白名单,而不是来自浏览器的标头,但 CloudFront 配置是相同的。

您无法Host在 CloudFront 中的静态自定义源标头配置中使用 - 这不是受支持的配置。如果允许,Lambda 触发器具有与该设置相同的效果。

相关内容