我目前有一个基于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选择性地提供某些页面并在负载均衡器级别控制它的方法?
答案 0 :(得分:1)
ELB本身目前不支持此功能,但ELB提供X-Forwarded-Proto
标头。您可以检查此信息以查看来自客户端的请求是否通过HTTPS。然后,您可以根据需要提供重定向响应,而不是页面内容。有关详细信息,请参阅AWS人员的this blog post。
你必须实现这个逻辑
使用中间件,例如rack-ssl-enforcer
查看rack ssl enforcer的文档,
它似乎支持X-Forwarded-Proto
开箱即用,
所以你可能根本不需要做任何事情。你可以看到
the source标题得到尊重。
(可能带有重定向响应 而不是在客户端上)
在反向代理中,例如您的应用服务器和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
根据您的配置,如果您在ELB和检查标头之间有任何其他反向代理,您可能需要配置它们以正确传递X-Forwarded-Proto
标头。例如,请参阅this issue。