Ruby on rails 端口443上的弹性负载平衡器适用于强制SSL Ruby on Rails应用程序,但为什么呢?

Ruby on rails 端口443上的弹性负载平衡器适用于强制SSL Ruby on Rails应用程序,但为什么呢?,ruby-on-rails,amazon-web-services,load-balancing,amazon-elastic-beanstalk,Ruby On Rails,Amazon Web Services,Load Balancing,Amazon Elastic Beanstalk,我的ruby on Rails应用程序配置如下: config.force_ssl = true 我设置了以下弹性负载平衡器: 有了这个配置,一切都正常,但我不明白为什么?使用上面的代码,我的应用程序实例将返回301重定向以响应HTTP请求。当负载平衡器处理HTTP请求时,它将作为HTTP请求转发到实例。这难道不应该导致另一个301,从而产生一个无休止的循环吗?编辑 我仔细考虑了一下我的答案,并决定更详细地讨论一下 网络通信通常由几层组成,其中包括物理层(信息通过的电缆/无线信道)、传输层(

我的ruby on Rails应用程序配置如下:

config.force_ssl = true
我设置了以下弹性负载平衡器:

有了这个配置,一切都正常,但我不明白为什么?使用上面的代码,我的应用程序实例将返回301重定向以响应HTTP请求。当负载平衡器处理HTTP请求时,它将作为HTTP请求转发到实例。这难道不应该导致另一个301,从而产生一个无休止的循环吗?

编辑 我仔细考虑了一下我的答案,并决定更详细地讨论一下

网络通信通常由几层组成,其中包括物理层(信息通过的电缆/无线信道)、传输层(通常为TCP/IP)、协议层(在本例中通常为HTTP或HTTPS),最后是应用层(rails应用程序处理)

Rails通常不会接触到实际的HTTPS数据流,因为这是由您的Web服务器处理的。那么强制ssl是如何工作的呢

协议层由Web服务器(nginx,mongrel…)处理,这是谁首先关心强制ssl。当Web服务器将请求移交给应用层(因此,rails应用程序)时,它还提供大量元数据,包括请求者IP、请求路径、请求格式、大量头变量以及有关所用协议的信息

当请求通过端口443(并使用HTTPS协议)到达您的Web服务器时,Web服务器将头标志
SERVER\u protocol
设置为
HTTPS

如果代理服务器(如负载平衡器is)在443上接收到请求并将其转发到80,它会将
X-FORWARDED-PROTO=https
头添加到请求中,该头由Web服务器提供给rails应用程序

现在,长话短说:
config.force\u ssl
需要
SERVER\u协议
X-FORWARDED-PROTO
来表示
https

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

有关这方面的更多信息,请参阅弹性负载平衡器文档: