我通过强制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]
但是浏览器会进入重定向循环。无论我尝试过什么都没有解决这个问题。
答案 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
答案 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]