将主机 Header 映射到第二来源的自定义 header

Mapping Host Header to custom header for secondary origin

我正在寻找一种方法将请求主机 header 从云端源传递到 API 网关或自定义端点(亚马逊外部)。

本质上,我有多个域映射到云端 catchall,我试图 pre-render 基于服务器上的索引请求,同时让所有其他资源通过。

如果这不可能,lambda edge 能实现这样的事情吗?

谢谢!

在 Lambda@Edge 离开预览之前,这是您的解决方法:

为每个域名创建一个单独的 CloudFront 分配,并添加一个唯一的自定义源 header。

If you've configured more than one CloudFront distribution to use the same origin, you can specify different custom headers for the origins in each distribution and use the logs for your web server to distinguish between the requests that CloudFront forwards for each distribution.

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/forward-custom-headers.html

不言而喻,"use the logs for your web server" 只是该值的一种可能用途。您还可以通过检查插入的请求 header.

来使用它来识别请求针对哪个域

例如,对于站点 api-42.example.com,添加一个自定义来源 header X-Forwarded-Host,其静态值与主机名 api-42.example.com 相同。

CloudFront 在将请求发送到源服务器时将自定义源 header 添加到每个请求。

如果客户端出于某种原因发送相同的 header,CloudFront 会丢弃客户端发送的内容,然后再将您的 header 和值添加到每个请求。

由于实际的 CloudFront 分发本身是免费的,因此此解决方案没有真正的危害。如果您需要创建很多,可以使用 aws-cli 轻松编写脚本。默认情况下,帐户可以创建 200 个不同的分配,但您可以提交免费支持请求以增加该限制。

您现在可能正在考虑这对您的缓存命中率的影响,因为不同的站点不会共享一个公共缓存。这是一个合理的担忧,但由于各种原因,影响可能没有您预期的那么大——其中最重要的是 CloudFront 的缓存不是单一的。如果您的查看者访问了一个分布但来自世界的两个不同地区,那么这些用户几乎肯定会连接到不同的 CloudFront 边缘位置,因此无论如何都会访问不同的缓存实例。