AWS Elasticbeanstalk 单实例强制 SSL 重定向循环
Posted
技术标签:
【中文标题】AWS Elasticbeanstalk 单实例强制 SSL 重定向循环【英文标题】:AWS Elasticbeanstalk single instance Force SSL Redirect loop 【发布时间】:2013-12-20 05:06:08 【问题描述】:我遇到了强制使用 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]
但浏览器进入重定向循环。无论我尝试什么都没有解决这个问题。
【问题讨论】:
这里有同样的问题。事实是,在 ssl.conf 中,来自端口 443 的每个调用都“代理”到端口 80,因此您永远不会打开 https =。您找到解决方法了吗? 【参考方案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
【讨论】:
【参考方案2】:这是正确的方法:
RewriteEngine on
RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [L,R=301]
【讨论】:
这会导致我出现重定向循环。【参考方案3】:我遇到了同样的问题。这对我有用:
RewriteCond %SERVER_PORT !=443
RewriteCond %SERVER_ADDR !^127\.0\.0\.1
RewriteRule (.*) https://%SERVER_NAME/$1 [L]
【讨论】:
【参考方案4】:正如我在评论中提到的:
在 ssl.conf 中,来自端口 443 的每个调用都被“代理”到端口 80,因此您永远不会打开 https =。
我做了一些测试,发现 ssl.conf 中的 ProxyPass 指令并不是简单地将每个请求从端口 443 重定向到 localhost:80,而是基本上通过端口 80 从头开始重复向 Apache 的请求(至少,我是这么理解的)。
查看$_SERVER的值,发现HTTP_X_FORWARDED_FOR、HTTP_X_FORWARDED_HOST和HTTP_X_FORWARDED_SERVER在HTTPS 请求(但在 HTTP 请求期间 NOT 设置),同时 SERVER_ADDR 和 REMOTE_ADDR 在 HTTPS 请求期间设置为 127.0.0.1(但对于 HTTP 请求,它们设置为不同的值)。 p>
我假设您可以使用类似这样的方式轻松检查您的请求是否是纯 HTTP(检查语法,我对 Apache 很垃圾):
RewriteCond %ENV:HTTP_X_FORWARDED_SERVER !^$
或
RewriteCond %ENV:SERVER_ADDR !^127\.0\.0\.1
注意:我在 AWS 文档中找不到任何参考资料,这只是一个经验结果……他们可以轻松改变这种行为!
编码愉快! :)
【讨论】:
【参考方案5】:我相信(为 /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 Beanstalk without Elastic Load Balancer
【讨论】:
以上是关于AWS Elasticbeanstalk 单实例强制 SSL 重定向循环的主要内容,如果未能解决你的问题,请参考以下文章
在 AWS EBS 单实例 (Tomcat) 上安装 SSL 证书
将 AWS 颁发的证书用于单实例 Elastic Beanstalk 应用程序
AWS ElasticBeanstalk 上的 502 错误网关 Nginx 节点
如何将我的 DNS 指向 AWS ElasticBeanstalk 实例?