16

我已将我的 Elastic Beanstalk 环境配置为将所有页面重定向到 https,重定向有效,但是,实例未通过运行状况检查并被终止,任何想法如何配置重写规则?

我的配置:

NameVirtualHost *:80

<VirtualHost *:80>
.
.
.

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule !/_hostmanager/healthcheck https://%{SERVER_NAME}%{REQUEST_URI} [L,R] 
</VirtualHost>
4

11 回答 11

13

除了运行状况检查之外,Elastic Beanstalk 还需要访问多个 hostmananger URL。Grepping ,我看到了对和的/var/log/httpd/elasticbeanstalk-access_log请求。/_hostmanager/tasks/_hostmanager/healthcheck

以下是我/etc/httpd/sites/elasticbeanstalk在 EC2 实例上添加的规则:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/status$ 
RewriteCond %{REQUEST_URI} !^/version$ 
RewriteCond %{REQUEST_URI} !^/_hostmanager/ 
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

请注意,我还允许非 https 流量访问我的/status/version页面。我实际上将/status其用作实际的运行状况检查查找 URL,因此让该流量跳过重写将避免重定向并使状态查找更快(我假设)。

于 2012-03-02T20:42:39.330 回答
8

我认为这里的其他一些答案可能不是基于任意User-AgentAWS 当前设置的。当我查看 Apache 日志时,我看到了这个用户代理:

ELB-HealthChecker/1.0

在撰写本文时,以下mod_rewrite规则对我有用:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker.* 
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
于 2013-08-21T07:52:42.013 回答
6

截至 2016 年,这些答案都不适合我,但这有效:

1 检索/etc/httpd/conf.d/wsgi.conf

2 将以下内容添加到虚拟主机:(请注意,第三行可防止设置脚本/opt/elasticbeanstalk/hooks/config.py等待 5 分钟无法加载路径的问题/。)

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTP_HOST} !localhost
RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker.* 
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]

3 将文件放入您的存储库中,然后添加以下容器命令:

06_https:
  command: "cp wsgi.conf /opt/python/ondeck/wsgi.conf"

然后,安装脚本会自动将该文件复制到/etc/httpd/conf.d.

于 2016-04-29T09:55:43.993 回答
3

看起来 AWS 运行状况检查器使用用户代理“AWSHealthCheck”。

如果请求来自健康检查器用户代理,我通过避免重定向来解决这个问题。

就像是:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{USER_AGENT} !^AWSHealthCheck$ 
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
于 2012-12-03T13:59:08.573 回答
1

您可以将 ELB 配置为使用特定路径进行健康检查,例如 /ping。然后,您可以明确告诉 apache 不要重定向该 URL,而不是依赖 UserAgent 字符串。

您还可以告诉 ELB 使用 HTTPS 进行健康检查,然后将所有 HTTP URL 重定向到 HTTPS,包括健康检查。

这两个设置都可以在 EC2 控制台的负载均衡器部分进行更改。

于 2013-08-31T13:18:39.490 回答
1

此答案假设您已在负载均衡器安全组中启用 https,将 SSL 证书添加到负载均衡器,将 443 添加到负载均衡器转发的端口,并将您的域名指向具有 Route 53 的 Elastic Beanstalk 环境(或等效的 DNS 服务)。

您需要做的就是将以下内容添加到项目目录中的一个.config文件中.ebextensions

files:
  "/etc/httpd/conf.d/ssl_rewrite.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      RewriteEngine On
      <If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
      RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
      </If>

解释

这在 Elastic Beanstalk 之外是相当直接的。通常会添加一个 Apache 重写规则,如下所示:

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

或者,如果在负载均衡器后面,就像我们在这种情况下一样:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

但是,这些配置仅在一个<VirtualHost>块内起作用。将 更改RewriteCond<If>块允许它在块之外正常工作<VirtualHost>,允许我们放入独立的 Apache 配置文件。请注意,CentOS 上的标准 Apache 设置(包括 ElasticBeanstalk 上的设置)包括所有/etc/httpd/conf.d/*.conf匹配的文件,它与我们存储此文件的文件路径匹配。

如果您不在负载均衡器后面,则条件的-n '%{HTTP:X-Forwarded-Proto}'一部分会阻止它重定向,从而允许您在具有负载均衡器和 https 的生产环境与单实例且没有 https 的暂存环境之间共享配置。如果您在所有环境中都使用负载均衡器和 https,则这不是必需的,但拥有它并没有什么坏处。

我见过的糟糕的解决方案

我已经看到了很多针对这个问题的糟糕解决方案,值得通过它们来了解为什么需要这个解决方案。

  1. 使用 Cloudfront: 有人建议在 Elastic Beanstalk 前面使用非缓存 Cloudfront 设置来执行 HTTP 到 HTTPS 的重定向。这增加了一个不完全合适的全新服务(从而增加了复杂性)(Cloudfront 是一个 CDN;它不是在固有动态内容上强制使用 HTTPS 的正确工具)。Apache config 是这个问题的正常解决方案,而 Elastic Beanstalk 使用 Apache,所以我们应该这样做。

  2. SSH 进入服务器并...:这与 Elastic Beanstalk 的观点完全相反,并且存在很多问题。通过自动缩放创建的任何新实例都不会具有修改后的配置。任何克隆的环境都没有配置。任何数量的合理环境更改都将清除配置。这真是个坏主意。

  3. 使用新文件覆盖 Apache 配置:这进入了正确的解决方案领域,但如果 Elastic Beanstalk 更改服务器设置的各个方面(他们很可能会这样做),那么您将面临维护噩梦。另请参阅下一项中的问题。

  4. 动态编辑 Apache 配置文件以添加几行:这是一个不错的主意。这样做的问题是,如果 Elastic Beanstalk 更改其默认 Apache 配置文件的名称,它将无法正常工作,并且该文件可能会在您最不期望的时候被覆盖:https ://forums.aws.amazon.com/thread .jspa?threadID=163369

于 2016-10-07T18:23:17.050 回答
1

如果您尝试在 Wordpress 或 PHP 中执行此操作,则可以.htaccess如下设置,而无需通过 .ebextensions 进行任何修改:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/status\.html$
RewriteCond %{REQUEST_URI} !^/_hostmanager/
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
</IfModule>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

请记住将 status.html 更改为您用于执行 Elastic Beanstalk 运行状况检查的任何路径

有关更多信息,请参阅我的回复

于 2015-08-10T19:06:36.497 回答
0
于 2014-02-20T02:18:00.223 回答
0

创建一个静态 health.html。如果可能,作为配置模板。

于 2011-09-03T12:24:59.753 回答
0

对我来说,复制wsgi.conf到位从来没有奏效。EB 将无法部署,或者文件将被覆盖。

我发现唯一有效的答案是here。本质上,他曾经sed将必要的重写规则插入到wsgi.conf. 他说要添加的容器命令是

container_commands:
  01_http_to_https_redirect:
    command: 
      sed -i '/\<VirtualHost \*:80\>/a RewriteEngine On\nRewriteCond %{HTTP:X-Forwarded-Proto} !https\nRewriteRule \!/robots.txt https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]' /opt/python/ondeck/wsgi.conf

不要忘记将您的健康检查端点从robots.txt.

于 2015-08-08T22:47:37.870 回答
0

作为一项通用策略,对于我们来说,Apache 和 Nginx EC2 实例都位于 AWS 安全负载均衡器后面,它是:

  1. 在负载均衡器上,将端口 80 转发到实例上的端口 80
  2. 在实例上将端口 443 转发到端口 8080(例如)
  3. 在 Web 服务器中,监听两个端口(80 和 8080)
  4. 将端口 80 重定向到端口 443
  5. 向 EC2 添加环境变量“HTTPS”,值为“on”,例如使用 Elastic Beanstalk 软件配置

第 1 步确保 AWS 内部流量得到“自然”处理。

第 2 步只允许安全的外部流量到达我们的代码

第 5 步告诉 Web 服务器及其背后的内容(在我们的例子中是 Laravel)生成的 URL 应该被赋予 https: 方案。其他框架可能需要设置一些其他环境变量才能触发该行为。

于 2016-04-29T20:01:05.457 回答