根据地理位置,从同一个域名服务两个静态的S3网站

我目前的设置是,www.domain.com通过CloudFront为S3托pipe的静态网站提供服务,因此www.domain.com CNAME指向CloudFront分配,后者又指向S3静态网站URL。 CloudFront发行版将www.domain.com为备用域名。

我想使用Route53的地理位置function将请求从北美路由到当前的CloudFront(A),而所有其他请求则发送到另一个CloudFront(B)来托pipe另一个S3静态网站。 由于我无法将www.domain.com添加为两个CloudFront分配的备用域名,因此我使用通配符*.domain.com代替CloudFront A.

通配符工作,例如我设置的eu.domain.com正确地服务于CloudFront B站点。

我在Route53中正确设置了Geolocation规则, dig返回正确的CloudFront端点。 同样,Route53 Webtesting平台根据IP位置给出正确的端点。 但是, curl和网页浏览器会给出错误的内容 – 即即使我在欧盟也是CloudFront A.

我的configuration有什么问题吗? 出于某种原因,DNS级别的A级分发版存在无提示故障转移吗? 或者一些讨厌的caching? 这可以完成吗? 谢谢!

但是,curl和网页浏览器给出了错误的内容

实际上,他们在上下文中给出了正确的内容。 (坚持我,这里…)

从技术上讲,问题在于你实际上是想要/期待一个实际上是不正确的回应 – 如果实际上按照你预期的方式工作,根据请求做出的行为是错误的。

使用curl -v来查看请求标头。 他们可能会连接到通过查询eu.example.com检索到的地址,但请检查此请求标头:

 > Host: www.example.com 

浏览器实际上正在得到它所要求的。

这就是为什么您不能将相同的备用域名分配给两个CloudFront分配。 CloudFront – 就像基本上所有的Web服务器一样 – 使用浏览器发送的Host:头来了解浏览器希望看到的网站。 Web服务器不能看到你到他们的DNSpath。 在连接到为不同站点返回的IP地址的情况下,您可以做到这一点并不令人吃惊 – select任何CloudFront IP并伪造其他站点的Host:标头,这很可能会奏效,因为那么侦听该地址的CloudFront设备就可以在CloudFront中查找configuration并为请求提供服务。

只能使用CloudFront和Route 53完成此configuration。

您需要在EU的目标区域中的EC2中的代理服务器充当DNS中的eu域的目标,重写Host:标头,并将修改后的请求转发到CloudFront。