根据地理位置,从同一域提供两个静态 S3 网站

根据地理位置,从同一域提供两个静态 S3 网站

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

我想使用 Route53 的地理定位功能将来自北美的请求路由到当前的 CloudFront (A),而所有其他请求则转到托管另一个 S3 静态网站的另一个 CloudFront (B)。由于我无法www.domain.com为两个 CloudFront 发行版添加备用域名,因此我改用*.domain.comCloudFront A 的通配符。

通配符有效,例如eu.domain.com我设置正确服务于 CloudFront B 站点。

我在 Route53 中正确设置了地理位置规则,并dig返回了正确的 CloudFront 端点。同样,Route53 Web 测试台根据 IP 位置给出了正确的端点。但是,curlWeb 浏览器给出了错误的内容 - 即 CloudFront A,尽管我在欧盟。

我的配置有问题吗?出于某种原因,DNS 级别是否在 A 分布上进行了静默故障转移?还是某些令人讨厌的缓存?这可以做到吗?谢谢!

答案1

然而,curl 和网络浏览器给出了错误的内容

实际上,它们在上下文中给出了正确的内容。(请继续听我说……)

从技术角度来说,问题在于您实际上想要/期望的响应实际上是不正确的 - 如果它实际上按照您预期的方式工作,那么根据所提出的请求,这种行为就是错误的。

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

> Host: www.example.com

浏览器实际上得到的正是它所要求的内容。

这就是为什么您不能将相同的备用域名分配给两个 CloudFront 分发版。CloudFront(基本上与所有 Web 服务器一样)使用Host:浏览器发送的标头来了解浏览器想要查看哪个站点。Web 服务器无法看到将您带到它们的 DNS 路径。您可以在连接到返回给不同站点的 IP 地址时执行此操作,这并不奇怪——选择任何 CloudFront IP 并Host:为不同站点伪造标头,它很可能会成功,因为监听该地址的 CloudFront 设备很有可能可以找到 CloudFront 中的配置并处理请求。

仅使用 CloudFront 和 Route 53 无法完成此配置。

您需要在欧盟目标区域的 EC2 中安装一个代理服务器,作为 DNS 中 eu 域的目标,重写标Host:头,并将修改后的请求转发到 CloudFront。

相关内容