繁体   English   中英

端口443上的Elastic Load Balancer适用于强制SSL Ruby On Rails应用程序,但是为什么呢?

[英]Elastic Load Balancer on port 443 works for forced SSL Ruby On Rails application, but why?

我的ruby on Rails应用程序配置了以下内容:

config.force_ssl = true

我设置了以下弹性负载均衡器:

在此处输入图片说明

使用此配置,一切正常,但我不明白为什么? 使用上面的代码,我的应用程序实例将返回301重定向以响应HTTP请求。 负载平衡器处理HTTP请求后,会将其作为HTTP请求转发到实例。 这不应该导致另一个301,从而导致无限循环吗?

编辑我对自己的答案有所考虑,因此决定对其进行更详细的介绍。

网络通信通常由几层组成,其中包括物理层 (即信息经过的电缆/无线电信道), 传输层 (通常为TCP / IP), 协议层 (在我们的情况下通常为HTTP或HTTPS)最后是我们的Rails应用程序处理的应用程序层

Rails通常永远不会与实际的HTTPS数据流联系,因为这是由Web服务器处理的。 那么,force_ssl到底如何工作?

协议层由Web服务器(nginx,mongrel ...)处理,这是谁首先要关心强制ssl。 当网络服务器将请求移交给应用程序层(因此是Rails应用程序)时,它还会提供大量元数据,其中包括请求者IP,请求路径,请求格式,许多标头变量以及有关已使用信息的信息。协议。

当请求通过端口443到达您的Web服务器(并使用HTTPS协议)时,Web服务器SERVER_PROTOCOL标头标志SERVER_PROTOCOLhttps

如果代理服务器(例如负载平衡器)在443上收到请求并将其转发到80,它将向请求添加X-FORWARDED-PROTO=https标头,网络服务器可将其用于您的rails应用程序。

现在,长话短说: config.force_ssl需要SERVER_PROTOCOL X-FORWARDED-PROTO config.force_ssl X-FORWARDED-PROTO来表示https

原始答案 rails force_ssl方法并没有真正强制请求到达服务器上的端口443,当原始(客户端)请求通过ssl通过ssl发送时,它就可以满足。 负载平衡器(作为代理)将标头X-FORWARDED-PROTO设置为“ https”。 rails信任该信息,这就是为什么它起作用的原因。

有关更多信息,请参见弹性负载平衡器文档: http : //docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-for

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM