AWS Elastic Load Balancer有选择地启用SSL

时间:2014-08-29 13:16:52

标签: ruby-on-rails ssl amazon-web-services https amazon-elb

我目前有一个基于rails的网络应用,需要通过HTTP提供一小部分网页 - 但更喜欢通过HTTPS提供其余服务。在我当前的AWS设置中,SSL终止于弹性负载均衡器,并且与我的应用服务器的所有通信都通过HTTP进行。因此,像Rack SSL Enforcer这样的解决方案并不合适。目前,我在每个页面中提供以下JS代码段来处理重定向:

<% if should_be_ssl? %>
<script>
  if (window.location.protocol != "https:"){
    window.location.href = "https:" + window.location.href.substring(window.location.protocol.length);
  }
</script>
<% else %>
<script>
if (window.location.protocol != "http:"){
  window.location.href = "http:" + window.location.href.substring(window.location.protocol.length);
}
</script>
<% end %>

每次访问其中一个页面时,这会导致相对显着的性能损失。有没有人知道通过SSL选择性地提供某些页面并在负载均衡器级别控制它的方法?

1 个答案:

答案 0 :(得分:1)

ELB本身目前不支持此功能,但ELB提供X-Forwarded-Proto标头。您可以检查此信息以查看来自客户端的请求是否通过HTTPS。然后,您可以根据需要提供重定向响应,而不是页面内容。有关详细信息,请参阅AWS人员的this blog post

你必须实现这个逻辑

  1. 使用中间件,例如rack-ssl-enforcer

    查看rack ssl enforcer的文档, 它似乎支持X-Forwarded-Proto开箱即用, 所以你可能根本不需要做任何事情。你可以看到 the source标题得到尊重。

  2. 您的应用程序中的
  3. (可能带有重定向响应 而不是在客户端上)

  4. 在反向代理中,例如您的应用服务器和ELB之间的haproxy

    acl is_http hdr(X-Forwarded-Proto) http
    acl account_login url_beg /account/login
    redirect scheme https code 301 if account_login is_http
    
  5. 根据您的配置,如果您在ELB和检查标头之间有任何其他反向代理,您可能需要配置它们以正确传递X-Forwarded-Proto标头。例如,请参阅this issue