编辑
我考虑了一下我的答案,并决定更详细地了解它。
网络通信通常由几层组成,其中物理层是信息通过的有线/无线电通道,传输层是通常是 TCP/IP,协议层,在我们的例子中通常是 HTTP 或 HTTPS,最后是 应用层,这是我们的 rails 应用程序处理的。
Rails 通常不会接触到实际的 HTTPS 数据流,因为这是由您的网络服务器处理的。那么 force_ssl 究竟是如何工作的呢?
协议层由网络服务器(nginx、mongrel...)处理,谁可以首先关心强制使用 ssl。当 webserver 将请求交给应用层(也就是 rails app)时,它还提供了很多元数据,包括请求者 IP、请求路径、请求格式、很多 header 变量以及关于使用的信息协议。
当请求通过端口 443(并使用 HTTPS 协议)到达您的网络服务器时,网络服务器会将标头标志 SERVER_PROTOCOL 设置为 https。
如果代理服务器(如负载均衡器)在 443 上收到请求并将其转发到 80,它会将 X-FORWARDED-PROTO=https 标头添加到请求中,该请求可通过网络服务器提供给您的 rails 应用程序。
现在,长话短说:config.force_ssl 需要 SERVER_PROTOCOL 或 X-FORWARDED-PROTO 表示https。
原始答案
rails force_ssl 方法并不会真正强制请求到达服务器上的端口 443,当原始(客户端)请求通过互联网通过 ssl 发送时,它会得到满足。负载均衡器(作为代理)将标头 X-FORWARDED-PROTO 设置为“https”。 rails 相信这些信息,这就是它起作用的原因。
可以在弹性负载均衡器文档中找到更多信息:http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-for