Yus*_*kan 5 .htaccess mod-rewrite ssl codeigniter 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]
Run Code Online (Sandbox Code Playgroud)
但浏览器进入重定向循环.无论我尝试什么都没有解决这个问题.
正如我在评论中提到的那样:
在ssl.conf中,来自端口443的每个调用都被"代理"到端口80,所以你永远不会得到https = on.
我做了一些测试,我发现ssl.conf中的ProxyPass指令不是简单地将每个请求从端口443重定向到localhost:80,而是基本上从头开始通过端口80向Apache重复请求(至少,这是什么我明白了).
我检查了$ _SERVER的值,发现在HTTPS请求期间设置了HTTP_X_FORWARDED_FOR,HTTP_X_FORWARDED_HOST和HTTP_X_FORWARDED_SERVER(但是在HTTP请求期间没有设置它们),同时在HTTPS请求期间SERVER_ADDR和REMOTE_ADDR设置为127.0.0.1(但是它们被设置为HTTP请求的不同值).
我假设你可以很容易地检查你的请求是否是普通的HTTP这样的东西(检查语法,我对Apache很垃圾):
RewriteCond %{ENV:HTTP_X_FORWARDED_SERVER} !^$
Run Code Online (Sandbox Code Playgroud)
要么
RewriteCond %{ENV:SERVER_ADDR} !^127\.0\.0\.1
Run Code Online (Sandbox Code Playgroud)
请注意:我在AWS文档中找不到任何引用,这只是一个经验结果......他们可以轻松地改变这种行为!
快乐的编码!:)
我相信(给 /status 一个例外)您正在使用“负载平衡、自动缩放环境”,这意味着您中间有一个弹性负载平衡器。
如果您使用 Elastic Load Balancing 设置环境,则可能发生的情况是 Elastic Load Balancer (ELB) 使用(提供)安全内容 (HTTPS)。
但是,如果 ELB 和 EC2 实例之间的流量不安全,您的代码将始终检测到不安全的连接,因为 EC2 客户端实际上是 ELB,而不是最终用户(将 ELB 视为代理)。
旁注,我不确定 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 Load Balancer 的 Elastic Beanstalk
| 归档时间: |
|
| 查看次数: |
3176 次 |
| 最近记录: |