【问题标题】:AWS Elastic Beanstalk: Redirect host name via HTTPSAWS Elastic Beanstalk:通过 HTTPS 重定向主机名
【发布时间】:2017-05-22 03:59:43
【问题描述】:

我有一个站点 example.com,我希望将对该主机名的所有请求定向到 https://www.example.com。它目前在 Elastic Beanstalk 上的节点中运行。

我有以下重定向解决方案,但不确定如何执行第 3 步:

另外,这是做事的最佳方式(还是有更好的方式来实现以下目标?)

1) http://example.com -> https://www.example.com(完成 - 通过 A 记录到 S3 存储桶 - example here)。

2) http://www.example.com -> https://www.example.com(完成 - 通过 expressJS 中的 HTTPS 重定向 - example here)。

3) https://example.com -> https://www.example.com(我该怎么做?) - 这个电流给出了 ERR_CONNECTION_TIMED_OUT。

【问题讨论】:

  • 您使用的是什么 DNS 服务? Route53?
  • 我确实查看了 Elastic Beanstalk 上的 NodeJS 应用程序在 nginx 代理之后运行。使用 nginx 而不是 node 实现所有 http => https 和 !www => www 重定向会更干净(并且稍微快一点)。您可以使用 .ebextensions 执行此操作:docs.aws.amazon.com/elasticbeanstalk/latest/dg/…

标签: amazon-web-services redirect https dns amazon-elastic-beanstalk


【解决方案1】:

您可能希望以不同的方式处理 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 重定向。它将具有httphttps 的值。如果您收到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 目标。

【讨论】:

    猜你喜欢
    • 2019-02-05
    • 2018-08-14
    • 2016-06-19
    • 2020-05-15
    • 2019-10-29
    • 2017-04-22
    • 2020-09-29
    • 2018-01-01
    • 2014-07-05
    相关资源
    最近更新 更多