使用 S3/CloudFront 将 www 重定向到非 www,无需单独的存储桶

Posted

技术标签:

【中文标题】使用 S3/CloudFront 将 www 重定向到非 www,无需单独的存储桶【英文标题】:Redirect www to non-www with S3/CloudFront without seperate buckets 【发布时间】:2017-09-11 15:04:16 【问题描述】:

我正在使用 CloudFront 在 S3 上托管一个静态网站。

现在,www.example.comexample.com 返回相同,但我只希望 example.com 工作,www.example.com 重定向到 example.com

我知道我可以创建另一个将重定向到主存储桶 (example.com) 的存储桶,但是我将为每个网站创建两个存储桶和两个 CloudFront 分配,这会造成混乱。

还有其他方法可以实现吗?

【问题讨论】:

我投票结束这个问题,因为它不是一个编程问题,而且它在 Stack Overflow 上是题外话。应在Webmasters 上询问有关您网站的非编程问题。以后请在那里而不是在这里问。 【参考方案1】:

这对我有用

1- 创建了一个新的云前端分发,并使其引用与原始分发相同的 s3 存储桶。

2- 在路由 53 中创建了一条新记录,给它前缀 www.example.com 并使其引用新创建的云前端分布。

然后,如果您输入 example.com 或 www.example.com,它们将重定向到同一个存储桶,并且两者都可以正常工作

希望这有帮助。

【讨论】:

【参考方案2】:

最简单的配置方法(仅使用一个 CloudFront 和一个存储桶)是:

    在您的 DNS 提供商(例如 Route 53)中创建新的 CNAME 记录。记录应使用以下字段创建:记录名称 = www.example.com,类型 = CNAME,路由 = Simple,值 = 您的 CloudFront 分配域名,带有 .cloudfront.net 后缀的内容); 转到CloudFront > Distributions > your-distribution-id 并单击Edit,然后添加一个新的Alternate domain name (CNAME)(填写www.example.com 主机名)。保存更改后,您的分配将如下所示:

如果您选择此设置,请记住权衡是不好的 SEO。这是因为 URL 结构的一致性:www 和非 www 应该解析为相同的 URL。因此,如果您想提高您的 SEO,请尝试使用两个 CloudFront 分配的选项(其中一个使用 CloudFront Function 重定向到非 www)。

【讨论】:

【参考方案3】:

最近 AWS 引入了 Cloudfront Functions。正如您所猜测的,它允许您使用自定义函数代码在云端操作 http 请求/响应。

在他们的介绍性博客中,他们已经介绍了这个特定的重定向用例。根据他们的博客Introducing CloudFront Functions – Run Your Code at the Edge with Low Latency at Any Scale:-

URL 重写和重定向:生成响应以将请求重定向到不同的 URL。例如,将未经身份验证的用户从受限页面重定向到登录表单。 URL 重写也可用于 A/B 测试。

我已经尝试过这种方法。我做了什么:-

    设置新的云端分发。 将此分布映射到现有网站存储桶(无关紧要) 将新的redirect_www_to_naked function 与此分布相关联。 将此分布映射到Route 53 中的www 子域

这就是我的函数的样子:-

这是我的关联设置

编辑: 我写了一篇关于它的博客详细解释了如果你想了解更多 - Redirect WWW to Naked Domain using CloudFront Function

【讨论】:

【参考方案4】:

您似乎在使用 DNS 服务,因为您提到了 example.com 但是,我不知道您在做什么 DNS 服务。 因为53号线比较常用,所以在53号线的基础上进行描述。 域是在 example.com 的基础上描述的。

您可以以编程方式编写从 example.com 到 www.example.com 的重定向代码。但是,通常在 AWS 级别解决此问题。

在 AWS 级别解析需要两个存储桶。

    example.com(内容桶) www.example.com(存储桶重定向到 example.com) S3 -> 属性 -> 静态虚拟主机 -> 重定向请求 目标存储桶或域:example.com 协议:http(桶不需要文件。) 将 example.com 映射到 Route 53 上的 A 记录。 将 www.example.com 映射到 Route 53 的 A 记录。

然后,如果您请求 www.example.com,您将被重定向到 example.com。

如果您有任何问题,请随时提问! 谢谢。

更新 1 如果您为 example.com 和 www.example.com 激活 CloudFront CNAME, 一个bucket就可以获取example.com和www.example.com请求。但是不推荐,因为URL的一致性不好。

【讨论】:

我知道您的方法,但正如我在问题中提到的那样:“我知道我可以创建另一个存储桶来重定向到主存储桶 (example.com),但是我会每个网站都有两个存储桶和两个 CloudFront 分配,它会弄得一团糟。”我正在寻找一种不需要创建 2 个存储桶的方法.. @Theodore 拥有两个存储桶并不意味着您要部署两个 CloudFront。仅为 example.com 存储桶创建部署。 www.example.com 存储桶是用于重定向到 example.com 域的存储桶。 桶必须是公开的吗 主存储桶(包含文件)必须是公开的...权限>存储桶策略 "Version": "2008-10-17", "Statement": [ "Sid": "PublicReadForGetBucketObjects", "Effect": "Allow", "Principal": "AWS": "*" , "Action": "s3:GetObject", "Resource": "arn:aws:s3:::example.com/*" ] 这并没有回答问题,更重要的是,它完全忽略了避免两个存储桶的请求。更不用说将 www 映射到裸域实际上并不会导致重定向,它只是为来自www 的相同内容,而不是我怀疑这是所要求的。除非Mapping www.example.com to Route 53's A record. 表示映射到存储桶,否则不清楚您的意思。无论如何,这不是一个答案,因为我理解它是当前没有云端的解决方案。

以上是关于使用 S3/CloudFront 将 www 重定向到非 www,无需单独的存储桶的主要内容,如果未能解决你的问题,请参考以下文章

Cloudfront 域名无法使用 S3、Cloudfront 和 Route 53 将 HTTP 重定向到 HTTPS

使用 S3、CloudFront 和源路径的静态网站托管的子文件夹重定向问题

AWS Elastic Beanstalk / S3 / CloudFront Cache-Control 标头

Amazon S3 无法通过 Cloudfront 上传文件

AWS S3+Cloudfront 静态网站子目录不起作用

Amazon S3 + CloudFront CORS 问题