问题
我正在使用自定义域名在 amazon S3 上托管静态 index.html。这一切在我的域名上都运行良好:网站。然而,当我访问www.site.com我收到错误。据我所知,我需要将 www URL 进行 301 重定向到裸 URL。
似乎有几种方法可以做到这一点,但我对 DNS 的了解有限,而且听起来其中许多选项都是不可取的。
选项
有两个 A 记录,一个带有 www,一个不带有。显然这会导致 SEO 问题,因为 Google 会将其视为重复内容。
拥有一个重定向存储桶,所有内容都通过该存储桶进行路由。这可能会导致 CloudFront 出现问题。 https://stackoverflow.com/questions/10115799/set-up-dns-based-url-forwarding-in-amazon-route53
使用 PTR 记录进行重定向 - 但显然这是不可取的。 如何在 Route53 中将 www 重定向到非 www?
因为我的名字在 godaddy,所以使用 godaddy 进行重定向: https://support.google.com/blogger/answer/58317?hl=en
使用像 wwwizer 这样的免费服务 http://wwwizer.com/naked-domain-redirect
使用 Amazon 的 bucket 重定向。这带来了一个大问题,即每个域都需要两个 bucket,这意味着我只能拥有 50 个域,而不是 100 个。这对我来说是个问题。 https://i.stack.imgur.com/lqict.png
我已尝试列出我知道的所有选项。请问有谁更了解域和 DNS 可以帮助我确定哪种方式是最佳选择,同时兼顾性能、可靠性和 SEO。
答案1
选项 1 不适用于 S3 托管的网站,因为 S3 在Host:
传入 HTTP 请求的标头中看到必须与存储桶的名称完全匹配,并且设置重复的 A 记录并不能解决您的问题。
出于同样的原因,选项 2 不起作用——请求永远不会到达包含重定向规则的存储桶,除非请求指向存储桶的实际名称。您链接到的答案只不过是执行选项 6 的“困难方法”,并且要求每个主机名一个存储桶。
选项 3 没什么用,因为 PTR 记录不会导致浏览器重定向。PTR 记录通常用于反向 DNS,但在此上下文中没有应用。
选项 4 Go Daddy 有“域名转发”和“子域名转发”选项,但这意味着您必须让 Go Daddy 托管您的 DNS,而不仅仅是在那里注册您的域名(这是两个不同的事情,通常但不一定同时发生)。如果您现在拥有的是这个,您可以将“www”子域名(www.example.com)“转发”到顶点(example.com),Go Daddy 通过为 www.example.com 创建指向其自己的 Web 服务器的 A 或 CNAME 记录来实现此目的,这些服务器会生成 HTTP 301 或 302 重定向到http://example.com。如果您的 DNS 由 Go Daddy 托管,而不是由 Route 53 托管,那么这可能是最简单的选项,但如果您的 DNS 不是由 Go Daddy 托管,则此选项不可用。由于您使用域的顶点作为 S3 中的网站,我假设您的 DNS 由 Route 53 托管,这意味着这将不起作用。
选项 5 似乎是一个坏主意,引入了不必要的第三方,但更重要的是,它解决了错误的问题。他们不会将 www.example.com 重定向到 example.com,而是将 example.com 重定向到 www.example.com。
选项 6 是一个不错的选择,但它也存在您提到的缺点,即每个 AWS 账户可用的存储桶数量有限。
如果你有那么多不同的域,那么另一个选择是在 EC2 中分配一个弹性 IP 地址(这样你就有一个不会改变的静态端点 IP 地址),然后启动一个绑定到该 IP 地址的微实例并安装HAProxyHAProxy 实际上是为实际 Web 服务器的前端而设计的,它平衡了来自外部世界的流量,但它也有生成重定向的能力。配置并不复杂,HAProxy 的 CPU 效率很高,所以我希望你能从 Micro 中完成很多工作,但如果流量需要,你总是可以将其扩展到更大的实例。
您需要在端口 80 上配置前端侦听器:
frontend main
bind *:80
然后为每个域创建一个访问控制列表 (acl) 来监视“主机”http 标头中包含该主机名的请求......
acl www.example.com hdr(host) -i www.example.com
...然后配置重定向以生成到所需主机名的 301。
redirect prefix http://example.com if www.example.com
在 DNS 中,您需要为 www.example.com 配置一个指向此 Micro 实例的公共弹性 IP 地址的 A 记录。
通过此配置,路径将被保留,因此发送到任何路径的请求都会被保留为http://www.example.com/foo/bar将会遇到 HTTP 301 重定向到其他域上的完全相同的路径,例如http://example.com/foo/bar。
您可以使用在机器上运行的实际 Web 服务器(例如 Nginx 或 Apache)执行类似的事情,但 HAProxy 是一种非常重型但又轻量级的工具,似乎非常适合这样的任务,而生成这样的重定向是我在操作中使用它的事情之一。