如果我已将 CloudFront 设置为 Route 53 中的地址作为原点,并将地理位置路由设置为 Route 53 中的记录,那么 Route 53 会根据 CloudFront 边缘位置 IP 还是最终用户的 IP 进行地理位置定位?
答案1
原始服务器的 DNS 查找在 CloudFront 的“后端”完成,并将基于 CloudFront 边缘位置,不能用于测试查看器的地理位置。¹
(即使这在某种程度上是可能的,它仍然无法按预期工作,因为 CloudFront 不知道为其他查看者重新使用缓存响应的适当标准,这些查看者可能位于不同的国家,但访问同一边缘位置。)
您可以做的是根据查看者的国家/地区选择原始服务器,方法是将 CloudFront 配置为白名单CloudFront-Viewer-Country
请求标头,然后根据检测到的国家/地区,使用 Lambda @ Edge Origin Request 触发器来修改原始域名以及可能的Host
请求标头。
Origin Request 触发器仅在缓存未命中时触发,因此当缓存命中时,触发器无需触发 - 响应由缓存提供。并且响应将是正确的,因为将标头列入白名单(例如CloudFront-Viewer-Country
)意味着 CloudFront 开始将该标头视为缓存键的一部分 - 因此 CloudFront 根据它看到的此标头的不同值保留相同资源的单独/独立的缓存副本,并且除非该标头值匹配(或不存在 - 这是一个单独的缓存版本),否则不会提供缓存响应。因此,给定页面的缓存命中要求来自CloudFront-Viewer-Country
缓存响应的与来自新请求的匹配。简而言之,在这样的配置中,CloudFront 在缓存方面做了正确的事情™。
看示例:使用源请求触发器根据国家/地区标头更改源域名来自Amazon CloudFront 开发人员指南此类触发器的代码简单示例。对其进行自定义以符合您的业务规则。
¹但是,它可以用于从 CloudFront 到源服务器的基于延迟的路由,因为基于延迟的路由的任务是选择与地理位置接近的目标相对应的 DNS 响应,而不是基于地缘政治边界。在这种情况下,最佳目标将是最靠近边缘的目标,而不是最靠近查看器的目标,尽管在实践中,这两个目标通常是相同的,因为边缘是根据与查看器的接近程度在前端选择的。