将CloudFront主机标头转发到API网关

Law*_*eld 7 wildcard-subdomain amazon-web-services amazon-cloudfront aws-lambda aws-api-gateway

我们有一个指向CloudFront分布的通配符(*)子域.起源是API网关.

我们需要知道HostAPI网关中的原始标头,以便我们可以路由请求.

简单地将HostCloudFront中的标题列入白名单会在通过HTTP访问CloudFront分配时返回错误 - 可能是因为API Gateway需要Host标头来知道要调用的API.

如果是这种情况,是否可以Host通过X-Forwarded-HostCloudFront 将标头转发到API网关?或者......是否有另一种方法可以在API网关中使用通配符子域?

Ten*_*ian 8

我在当天晚些时候回答这个问题,尽管它有一个已接受的答案,因为这个问题出现在对此问题的搜索顶部:

如今,完全可以Host通过 CloudFront 将原始标头动态转发X-Forwarded-Host到 API 网关,而无需按照建议硬编码自定义原始标头。

这可以通过创建查看器请求边缘函数(Lambda@Edge 或 CloudFront 函数)来实现,该函数在请求到达 CloudFront 之前拦截请求,将传入标头映射Host到请求标头X-Forwarded-Host,然后X-Forwarded-Host在传递请求标头之前将新标头附加到请求标头。

然后将X-Forwarded-HostAPI 网关源的标头列入白名单。

在 Node.js 中,边缘函数如下所示:

export function handler(event, context, callback) {
    const request = event.Records[0].cf.request;

    request.headers['x-forwarded-host'] = [{
        key: 'X-Forwarded-Host',
        value: request.headers.host[0].value
    }];

    return callback(null, request);
}
Run Code Online (Sandbox Code Playgroud)

  • 我已经研究这个问题太久了,这是迄今为止我找到的最完整的答案。但是,我仍然无法理解为什么 CloudFront 无法设置 X-Forwarded-Host 标头本身。为什么我们需要为此编写代码并支付 Lambda 执行费用?对于如此基本的东西来说似乎有点过分了。此时,只需将自定义标头添加到我的源中即可完成这项工作,这可能会更容易且更便宜。 (2认同)