我正在努力让我们的drupal站点使用Apache和mod_rewrite在AWS负载均衡器后面以完整的https运行。 ELB充当SSL证书提供者。所有流向ELB的流量都应加密,然后流向EC2实例的流量是正常的HTTP(非常标准)。
我尝试了各种.htaccess和Apache conf.d / * .conf mod_rewrite条件和规则。当我能够将流量重定向到https时,它将打破ELB的健康检查,带来我的不健康的" EC2实例退出池中。如果我试图修复它以便ELB运行状况检查通过,我就会遇到无限重定向问题。
经过一周左右的工作,我终于找到了解决方案。如果您遇到同样的问题,请查看此处!它对你来说可能不会100%有效,但至少我可以对如何修复它有所了解。
答案 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]
对于像我这样的菜鸟,起初很难搞清楚,但这是细分:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
这是关注的
协议由负载均衡器发送。如果协议不是
https,启动RewriteRule。
RewriteCond %{HTTPS} off
如果流量前往非HTTPS的网站,请启动RewriteRule
RewriteCond %{REQUEST_URI} !=/healthy.html
这是重要的一点。我有一个简单的healthy.html文件,其中包含“成功!”一词。在Apache的主drupal webroot目录中。当ELB访问healthy.html文件时,它将绕过我们的重写规则。如果没有,ELB运行状况检查将失败,使我们的服务器脱机。
RewriteRule ^ https://example\.com%{REQUEST_URI} [L,R=301]
这是实际的重写规则。如果所有上述条件都通过,则会将传入的URL重写为https://example.com/whatever
。顺便说一句,L代表“最后”,如“这是此集合的最后一条规则”,“R = 301”代表“301重定向”。
如果我手动输入https://www.example.com
(开头使用https),则唯一一次没有进行正确的重定向。我想我可以用另一个简单的RewriteCond解决这个问题。