我有一个名为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>