如何将 route53 记录指向 *任何* 子域的存储桶?

如何将 route53 记录指向 *任何* 子域的存储桶?

我有一个名为www.mybucket.com 我有一条 A 记录: name =www.mybucket.com。它很好地回答了 bucket 中包含的 index.html。

现在我想发送任何子域名到该存储桶。

我首先尝试使用特定的子域名:

  • A 记录别名
    • 名称:alias.mytestbucket.com
    • 别名目标www.mytestbucket.com
    • 结果:404,NoSuchBucket,指定的存储桶不存在
  • 没有别名的 CNAME 记录
    • 名称:cname.mytestbucket.com
    • 价值:www.mytestbucket.com
    • 结果:404,NoSuchBucket,指定的存储桶不存在
  • 带别名的 CNAME 记录
    • 名称:cnamealias.mytestbucket.com
    • 别名目标:cname.mytestbucket.com。(提供的唯一选项......)
    • 结果:404,NoSuchBucket,指定的存储桶不存在

没有更多想法...

最终目标是将所有子域名重定向到存储桶www.mybucket.com。但是如果能够将不同的子域名发送到不同的存储桶就更好了……

答案1

我认为这是不可能的。它的工作原理是客户端解析www.mybucket.com到为数百万其他存储桶提供服务的通用 S3 端点。然后它会发送主机 HTTP 标头 Host: www.mybucket.com。然后,S3 服务将主机标头www.mybucket.com与您的存储桶名称进行匹配www.mybucket.com,并从那里提供index.html文件。这就是它的工作原理。

即使你最后让 A/ALIAS/CNAME*.mybucket.com指向它www.mybucket.com仍解析为通用 S3 地址- 这就是 DNS 的工作方式,它不关心任何中间名称。

现在如果你尝试访问xyz.mybucket.com你的浏览器发送主机标头Host: xyz.mybucket.com-> S3 无法将其映射到任何现有存储桶 -> 你会得到没有这样的桶错误。

所以不可以,你不能这样做。


可能的解决方法:你可以使用反向代理例如在 EC2 或 Fargate 容器中,并指向*.mybucket.com此代理主机名。然后,代理将向 S3 发出后端请求,并将文件提供给客户端。缺点是一切都必须通过代理,牺牲了高可用性S3 API。

希望有帮助:)

答案2

@MLu 的回答是正确的,我只是添加了一种可能的解决方法。

它对 OP 不起作用任何子域名要求,并且它不是很好,因为它不可扩展和可维护,但对于随着时间的推移几乎没有变化的小型网站来说效果很好。

解决方案是使用 JS 强制重定向,为您想要公开的每个子域创建一个 S3 存储桶,每个存储桶都提供一个静态网站(与主/原始网站相同的配置),仅包含一行 index.html 文件。示例:

名为“some.example.com”的新存储桶:

<!DOCTYPE html><html><body><script type="text/javascript">window.location="http://www.example.com"</script></body></html>

相关内容