![根据地理位置,从同一域提供两个静态 S3 网站](https://linux22.com/image/697616/%E6%A0%B9%E6%8D%AE%E5%9C%B0%E7%90%86%E4%BD%8D%E7%BD%AE%EF%BC%8C%E4%BB%8E%E5%90%8C%E4%B8%80%E5%9F%9F%E6%8F%90%E4%BE%9B%E4%B8%A4%E4%B8%AA%E9%9D%99%E6%80%81%20S3%20%E7%BD%91%E7%AB%99.png)
我当前的设置是 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.com
CloudFront A 的通配符。
通配符有效,例如eu.domain.com
我设置正确服务于 CloudFront B 站点。
我在 Route53 中正确设置了地理位置规则,并dig
返回了正确的 CloudFront 端点。同样,Route53 Web 测试台根据 IP 位置给出了正确的端点。但是,curl
Web 浏览器给出了错误的内容 - 即 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。