您可能希望以不同的方式处理 www 子域和裸顶点。
1) http://example.com -> https://www.example.com
处理裸 (apex) 域重定向的最简单途径是进入 Route53 并设置 apex 以使用 S3 存储桶目标的 A 别名记录。在 S3 存储桶中,您可以启用“将所有请求重定向到另一个域”并重定向到 https://www.example.com。
此解决方案仅适用于 http 请求,但不适用于 https,因为 S3 不会为 https 请求终止 SSL。请参阅 #3 了解适用于 http 和 https 的解决方案。
2) http://www.example.com -> https://www.example.com
您可以在应用程序中使用X-Forwarded-Proto HTTP 标头进行相同的域 www http => https 重定向。它将具有http 或https 的值。如果您收到http,您可以重定向到https。
一个 apache 示例如下所示:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
一个 nginx 示例可能如下所示:
if ($http_x_forwarded_proto != "https") {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
或者,您可以使用 Cloudfront 将您的 Elastic Beanstalk 应用程序放在前面,并在那里实现 http => https 重定向。在“行为设置”中,您可以选中单选按钮“将 HTTP 重定向到 HTTPS”。
3) https://example.com -> https://www.example.com
您将需要一个 SSL 证书,其主题备用名称涵盖 example.com 和 www.example.com。你可以通过AWS Certificate Manager免费获得这个。您可以“添加更多名称”,这将允许您在一个证书中涵盖 *.example.com 和 example.com。 Certificate Manager 与 Cloudfront 完全集成,因此它是一个不错的选择。
云端选项:
Cloudfront 在这里是一个不错的选择——尤其是如果您使用它来展示整个应用程序(apex 和 www)。
在 Cloudfront 中的“备用域名 (CNAME)”中,您需要同时添加 example.com 和 www.example.com(用逗号或换行符分隔它们)。您还将指定涵盖两个域的数字证书。
Elastic Beanstalk 选项:
如果您不想使用 Cloudfront,您可以在弹性负载均衡器处终止 SSL,而不是为 apex 和 www 终止 SSL,并使用您的应用层 http 服务(apache、nginx 等)实现相同的 !www 重定向。只需添加涵盖两个域(apex 和 www 子域)的 SSL 证书。
实现非 www 重定向:
使用任一终止选项,您都会收到一个对 https://example.com 的请求,该请求将返回到 Elastic Beanstalk 上的源服务器,但是您需要返回一个 301,将浏览器定向到应用层的 https://www.example.com。
一个 apache 示例:
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
一个 nginx 示例:
server {
server_name "~^(?!www\.).*" ;
return 301 $scheme://www.$host$request_uri;
}
Apex 的 Route53 别名记录:
无论使用哪种解决方案,您都需要在 apex 上使用 Route53 A Alias 记录才能完成这项工作,因为 apex(裸)域不支持 CNAME 记录。您需要指定 Elastic Beanstalk 目标或 Cloudfront 目标。