在AWS弹性负载均衡器后面的Drupal中启用https

时间:2016-04-22 18:30:10

标签: amazon-web-services ssl drupal https amazon-elb

我正在努力让我们的drupal站点使用Apache和mod_rewrite在AWS负载均衡器后面以完整的https运行。 ELB充当SSL证书提供者。所有流向ELB的流量都应加密,然后流向EC2实例的流量是正常的HTTP(非常标准)。

我尝试了各种.htaccess和Apache conf.d / * .conf mod_rewrite条件和规则。当我能够将流量重定向到https时,它将打破ELB的健康检查,带来我的不健康的" EC2实例退出池中。如果我试图修复它以便ELB运行状况检查通过,我就会遇到无限重定向问题。

经过一周左右的工作,我终于找到了解决方案。如果您遇到同样的问题,请查看此处!它对你来说可能不会100%有效,但至少我可以对如何修复它有所了解。

1 个答案:

答案 0 :(得分:1)

这是我对一个网站的回答,我希望所有流量都转到https://example.com。 (如果你想要https://www.example.com,你可以做一些调整)

首先,Drupal的settings.php文件位于/sites/default/settings.php:

我在此文件中有以下内容:

$base_url = '//example.com';
$conf['reverse_proxy'] = TRUE;
$conf['reverse_proxy_addresses'] = array('name-of-my-loadbalancer.us-west-2.elb.amazonaws.com');
$conf['reverse_proxy_header'] = 'HTTP_X_CLUSTER_CLIENT_IP';

老实说,我不知道上面的“reverse_proxy”设置是否真的有必要。事实上,我已经禁用它们,它似乎不会影响任何东西,所以它可能不会。重要的是确保您的settings.php文件中包含$base_url = '//example.com';

下一部分是配置.htaccess文件。以下是重要的部分:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !=/healthy.html
RewriteRule ^ https://example\.com%{REQUEST_URI} [L,R=301]

对于像我这样的菜鸟,起初很难搞清楚,但这是细分:

  1. RewriteCond %{HTTP:X-Forwarded-Proto} !https这是关注的 协议由负载均衡器发送。如果协议不是 https,启动RewriteRule。

  2. RewriteCond %{HTTPS} off如果流量前往非HTTPS的网站,请启动RewriteRule

  3. RewriteCond %{REQUEST_URI} !=/healthy.html这是重要的一点。我有一个简单的healthy.html文件,其中包含“成功!”一词。在Apache的主drupal webroot目录中。当ELB访问healthy.html文件时,它将绕过我们的重写规则。如果没有,ELB运行状况检查将失败,使我们的服务器脱机。

  4. RewriteRule ^ https://example\.com%{REQUEST_URI} [L,R=301]这是实际的重写规则。如果所有上述条件都通过,则会将传入的URL重写为https://example.com/whatever。顺便说一句,L代表“最后”,如“这是此集合的最后一条规则”,“R = 301”代表“301重定向”。

  5. 如果我手动输入https://www.example.com(开头使用https),则唯一一次没有进行正确的重定向。我想我可以用另一个简单的RewriteCond解决这个问题。