我正在寻找一种方法将请求主机标头从云端源传递到API网关或自定义端点(亚马逊之外)。
基本上我有多个域映射到cloudfront catchall,我试图根据服务器上的索引请求进行预渲染,同时让所有其他资源通过。
如果这是不可能的,那么lambda edge能够实现这样的目标吗?
谢谢!
答案 0 :(得分:2)
在Lambda @ Edge离开预览之前,这是你的解决方法:
对于每个域名,请创建单独的CloudFront分配,并添加唯一的自定义原始标头。
如果您已配置多个CloudFront分配以使用相同的来源,则可以为每个分发中的起源指定不同的自定义标头,并使用Web服务器的日志来区分CloudFront针对每个分发转发的请求
http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/forward-custom-headers.html
不言而喻,“使用Web服务器的日志”只是此值的一种可能用途。您还可以通过检查插入的请求标头来使用它来识别请求所针对的域。
例如,对于网站api-42.example.com
,添加自定义原始标头X-Forwarded-Host
,其静态值与主机名api-42.example.com
相同。
CloudFront在将每个请求发送到原始服务器时会将自定义原始标头添加到每个请求中。
如果客户端出于任何原因发送相同的标头,CloudFront将丢弃客户端发送的内容,然后将标头和值添加到每个请求中。
由于实际的CloudFront发行版本身是免费的,因此在此解决方案中没有真正的危害。如果你需要创建很多这些,那很容易用aws-cli编写脚本。默认情况下,帐户可以创建200个不同的发行版,但您可以提交免费的支持请求以增加该限制。
您现在可能正在考虑这对缓存命中率的影响,因为不同的站点不会共享公共缓存。这是一个有效的问题,但由于各种原因,影响可能没有您期望的那么大 - 其中最重要的是CloudFront的缓存不是单一的。如果您有观众来自世界上两个不同地区的单个发行版,那么这些用户几乎肯定会连接到不同的CloudFront边缘位置,因此无论如何都会遇到不同的缓存实例。