Amazon S3静态托管与Namecheap DNS - 如何正确路由非www前缀的URL

47

我一直在阅读其他帖子,试图弄清楚这个问题的根源... 但我需要一些澄清。

当输入 www.example.com/MyDirectory 时,我能够使所有域请求完美地落到我的 Amazon S3 存储桶上。

如果我输入没有 www 的 example.com/MyDirectory,它将失败。

如何正确地使不带 www 的 URL 请求路由到同一个 Amazon S3 存储桶?


请查看此博客 https://aws.amazon.com/blogs/aws/root-domain-website-hosting-for-amazon-s3/ - error2007s
正在检查中... - jremi
我试图避免将域名转移到Amazon Route 53以进行dns。但如果这是最好的选择,那么也许我需要这样做... - jremi
你的域名提供商是谁?很多时候,域名提供商也会提供将非 www 域名重定向到 www 域名的功能。 - error2007s
Namecheap是域名提供商。 - jremi
2
好的,您的域名提供商提供了重定向服务,请查看此步骤,对于 Namecheap,请访问 https://www.namecheap.com/support/knowledgebase/article.aspx/545/51/how-do-i-set-up-url-redirect-when-i-use-your-freedns-service。 - error2007s
3个回答

53

我使用了jremi的答案,但是像下面提到的那样,邮件传递存在问题。经过一些时间与NameCheap支持团队的沟通,我找到了一个可行的解决方案。

NameCheap设置

CNAME Record          www   example.com.s3-website-us-west-1.amazonaws.com.
URL Redirect Record   @     www.example.com  (unmasked)

S3设置(仅需要1个存储桶)

[S3 Bucket]
Bucket name: www.example.com     <---- This must match your domain exactly
Static website hosting set to:
"Enable website hosting"

S3存储桶策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::www.example.com/*"
        }
    ]
}

这使得example.comwww.example.com都能够正常工作,而且我的NameCheap电子邮件也能使用。


18
我认为URL重定向记录需要您指定包括协议的URL,因此它应该是http://www.example.com。当我省略了http://时,在Namecheap控制台中出现错误,提示URL格式不正确。 - Adam Parkin
1
这是唯一有效的解决方案。得票最多的解决方案有几个缺点。 - whoisjuan
4
如果有人想知道 - 您的存储桶名称必须与您的域名完全相同。@sirclesam这样做不仅仅是为了举例。 - user10706046
谢谢,它运行了。然而,即使我输入 example.com,它现在也会将我重定向到 www.example.com。您知道如何使其停留在 example.com 上吗? - Kek

53

我最终采用了以下解决方案:

我正在使用Namecheap作为DNS,Amazon S3桶启用了静态托管...

该解决方案使得能够访问根域和www域。在namecheap高级DNS配置中,我有以下设置:

CNAME Record    @    domain.com.s3-website-us-west-1.amazonaws.com.
CNAME Record   www   www.domain.com.s3-website-us-west-1.amazonaws.com.
在Amazon S3配置中,我创建了两个单独的存储桶。
[S3 Bucket #1]
Bucket name: www.example.com
Static website hosting set to:
"Enable website hosting"

[S3 Bucket #2]
Bucket name: example.com
Static website hosting set to:
"Redirect all requests to another host name" pointing to www.example.com (Bucket #1)

通过这种配置,任何以根域名访问的网站流量都可以访问 Amazon S3 存储桶容器 example.com 并通过 Amazon 自动重定向到服务所有静态内容的主 S3 存储桶 www.example.com

如果有人尝试直接连接到 www 域名,则会直接访问 Amazon S3 容器 www.example.com,而不需要通过 example.com 存储桶进行重定向。

如果您在使您的根域名流量正确路由方面遇到问题,请参考此配置。


1
有趣的是,Amazon官方文档包括在Route53中设置名称记录并在注册商中切换到它们作为DNS提供程序。@jremi的解决方案确实有效,而且在我看来比更改DNS提供商要简单!http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html - thom_nic
7
这不是合法的DNS配置。根据RFC1034,您不能在同一名称下同时拥有CNAME和其他记录类型。区域根至少具有SOA和NS记录,但使用此配置最有可能遇到的问题涉及通过MX记录进行邮件路由。请参见http://serverfault.com/questions/613829/why-cant-a-cname-record-be-used-at-the-apex-aka-root-of-a-domain。 - GSnyder
1
@julienbouteloup - 看看我在这里的回答。使用URL重定向,我成功让Namecheap电子邮件工作了。 - sirclesam
@jremi 我也有同样的设置。自从创建CNAME记录以来已经过去了大约11个小时。而且,我最近才购买了该域名。通常需要多长时间才能生效? - Prathamesh dhanawade
@Prathameshdhanawade 我已经有一段时间没有使用过这个了。然而,DNS更改可能需要长达24小时的时间。这是因为DNS需要在整个互联网上生效需要一定的时间。 - jremi
显示剩余4条评论

3
我使用了sirclesam上面的方法,这让我成功了95%,但我的网站仍无法加载,直到我在AWS S3控制台中更改了一些配置。
以下是需要采取的步骤:
1.导航到S3仪表板 2.单击要使用的存储桶(www.example.com) 3.单击“权限”导航栏选项卡 4.应该会出现一个带有两列和一个位于框右上角的“编辑”按钮的框——单击该编辑按钮 5.总共应该有4个复选框——取消选中最后两个 6.保存,然后尝试访问您的站点
这对我起作用了。我最初是按照指南进行的,该指南仅指出需要选择一个(第三个)复选框,但这导致我的存储桶仍然阻止访问,因此取消选择最后一个复选框才解决了问题。
为了进一步澄清,应取消选中的第一个复选框如下所示: “阻止通过新公共存储桶策略授予的存储桶和对象的公共访问权限” 第二个复选框(也应被取消选中)如下所示:“阻止通过任何公共存储桶策略对存储桶和对象进行公共和跨账户访问”

1
你能否记录一下第5步中底部的两个复选框是什么?如果亚马逊更改了选项的顺序和数量,那么顺序可能会有所不同。知道你切换关闭的具体属性将更有帮助。 - ORyan
1
@ORyan 当然没问题。 第一个框中写着: “通过新的公共存储桶策略阻止对存储桶和对象的公共访问” 第二个复选框中写着: “通过任何公共存储桶策略阻止对存储桶和对象的公共和跨账户访问” - regs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接