使用 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.com
和 example.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 标头