我正在托管一个静态网站,使用 Amazon Route53 作为 DNS,使用 S3 作为 html 文件。它运行良好。
当前设置为:
example.com. A ALIAS s3-website-us-east-1.amazonaws.com.
www.example.com. CNAME www.example.com.s3-website-us-east-1.amazonaws.com
(注意:example.com 和 www.example.com 是 S3 存储桶。我的 HTML 文件位于 example.com 存储桶中。)
现在我想添加一个像这样的通配符子域名 - 这是我尝试过的:
*.example.com. CNAME www.example.com.s3-website-us-east-1.amazonaws.com
这个想法是让 anything.example.com 正确解析到网站。但这似乎不起作用。所以当我访问网站:joker.example.com 时,我在浏览器上看到错误消息:
Code: NoSuchBucket
Message: The specified bucket does not exist
BucketName: joker.example.com
答案1
@edvinas.me 的回答是正确的。您必须为您的存储桶创建一个 cloudfront 分发。
当您创建cloudfront 分发时,将备用域名选项设置为 *.example.com。
然后使用 cloudfront url 如 d3lt3rsz2leycm.cloudfront.net。
现在您可以像这样添加通配符子域名:
*.example.com. CNAME 3lt3rsz2leycm.cloudfront.net.
并且应该可以工作。
答案2
Amazon S3 使用主机名来确定存储桶名称。
—http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html
主机名是浏览器在标头中发送的值的小写形式Host:
。无法配置存储桶以响应多个主机名。
有一些迂回的方法可以实现这一点,具体取决于您要做什么,但它将需要一个运行 HAProxy、Varnish、Apache 或类似程序的 EC2 实例,以通过重定向响应对通配符主机名的请求,将浏览器的地址栏重写为真实的主机名/存储桶名称,或者混合请求标头并将请求代理到 S3,这并不像听起来那么低效,因为同一区域内的 S3 和 EC2 之间没有数据传输费用,并且延迟很低。
答案3
您的 S3 存储桶配置为仅接受对 example.com(和/或 www.example.com)的请求。您无法将存储桶配置为接受或您希望激活的任何特定子域。
实现此目的的唯一方法是使用 Cloudfront 等外部服务http://aws.amazon.com/cloudfront/这将代理请求。
Michael(sqlbot)的回复似乎更详细地介绍了这一点。