【问题标题】:Elastic Load Balancer on port 443 works for forced SSL Ruby On Rails application, but why?端口 443 上的弹性负载均衡器适用于强制 SSL Ruby On Rails 应用程序,但为什么呢?
【发布时间】:2014-07-12 03:51:30
【问题描述】:

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

config.force_ssl = true

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

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

【问题讨论】:

    标签: ruby-on-rails amazon-web-services load-balancing amazon-elastic-beanstalk


    【解决方案1】:

    编辑 我考虑了一下我的答案,并决定更详细地了解它。

    网络通信通常由几层组成,其中物理层是信息通过的有线/无线电通道,传输层是通常是 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

    【讨论】:

      猜你喜欢
      • 2016-02-10
      • 2016-05-16
      • 1970-01-01
      • 2012-09-30
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      相关资源
      最近更新 更多