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_FORHTTP_X_FORWARDED_HOSTHTTP_X_FORWARDED_SERVERHTTPS 请求(但在 HTTP 请求期间 NOT 设置),同时 SERVER_ADDRREMOTE_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 实例?

只能从我的 ElasticBeanStalk 实例访问 AWS S3 存储桶

Elastic beanstalk 实例无法访问私有 S3 文件