AWS Elasticbeanstalk单实例强制SSL重定向循环

时间:2013-12-03 22:30:13

标签: .htaccess codeigniter mod-rewrite ssl amazon-web-services

我通过强制ssl遇到问题。我使用codeigniter并使用elasticbeanstalk在AWS单实例中部署它。我的htaccess规则如下:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

但是浏览器会进入重定向循环。无论我尝试过什么都没有解决这个问题。

5 个答案:

答案 0 :(得分:5)

正如我在评论中提到的那样:

  

在ssl.conf中,来自端口443的每个调用都被“代理”到端口80,所以你永远不会得到https = on。

我做了一些测试,我发现ssl.conf中的ProxyPass指令不是简单地将每个请求从端口443重定向到localhost:80,而是基本上从头开始通过端口80向Apache重复请求(至少,这就是我所理解的。)

我检查了 $ _ SERVER 的值,发现在 HTTP_X_FORWARDED_FOR HTTP_X_FORWARDED_HOST HTTP_X_FORWARDED_SERVER 期间设置了 HTTP_X_FORWARDED_FOR HTTPS 请求(但 HTTP 请求期间设置),同时 SERVER_ADDR REMOTE_ADDR HTTPS 请求期间设置为 127.0.0.1 (但 HTTP 请求设置为不同的值)。

我假设你可以很容易地检查你的请求是否是普通的HTTP(请检查语法,我对Apache很垃圾):

RewriteCond %{ENV:HTTP_X_FORWARDED_SERVER}   !^$

RewriteCond %{ENV:SERVER_ADDR}   !^127\.0\.0\.1

请注意:我在AWS文档中找不到任何引用,这只是一个经验结果......他们可以轻松地改变这种行为!

快乐的编码! :)

答案 1 :(得分:2)

我遇到了同样的问题。这对我有用:

RewriteCond %{SERVER_PORT} !=443
RewriteCond %{SERVER_ADDR}   !^127\.0\.0\.1
RewriteRule (.*) https://%{SERVER_NAME}/$1 [L]

答案 2 :(得分:1)

这是官方方式。在AWS文档中找到。

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

来源

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https-httpredirect.html

https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/security-configuration/https-redirect/php/https-redirect-php.config

答案 3 :(得分:0)

我相信(给你的例外/状态)你正在使用“负载平衡,自动调节环境”,这意味着你在中间有一个弹性负载均衡器。

如果您使用Elastic Load Balancing设置环境,那么Elastic Load Balancer(ELB)正在使用(提供)安全内容(HTTPS)时可能会发生这种情况。

但是,如果ELB和EC2实例之间的流量不安全,则您的代码将始终检测到不安全的连接,因为EC2客户端实际上是ELB,而不是最终用户(将ELB视为代理)。 / p>

旁注,我不确定SERVER_NAME变量如何与中间的ELB一起使用。

也就是说,如果您打算使用单实例,非负载均衡环境,则可以“关闭”负载均衡器(可能自2013年7月起)。 (参见参考文献#3)

参考:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.elb.html http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-types.html Elastic Beanstalk without Elastic Load Balancer

答案 4 :(得分:0)

这是正确的方法:

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