我正在处理的具体方案是尝试连接到AWS弹性负载均衡器后面的websocket连接,同时强制执行https / ssl而不是http / tcp。
要从http / s启用TCP / SSL升级,负载均衡器上的协议必须已设置为TCP而不是端口80上的HTTP和SSL而不是443上的HTTPS,这两者都转发到实例端口80使用TCP。
但是,将协议设置为TCP / SSL的一个副作用是x-forwarded-proto
标头不再设置,如此处所示:
Amazon Elastic load balancer is not populating x-forwarded-proto header
这使得使用http / tcp到https / ssl的任何传入请求的下一个挑战有些问题,因为这通常依赖于检查x-forwarded-proto
标题。
关于具体情况的更多细节:存在一个在其内部运行的Meteor.js进程的docker容器,该进程依次驻留在AWS Elastic Beanstalk应用程序中(默认情况下具有Nginx代理层,但这是不可访问的,因为使用了docker简单地从docker hub中提取容器定义,它位于上述ELB的后面。
最终,我在请求通过ELB,Nginx和docker代理层时检查我可用于我的应用程序的标头,尝试计算出客户端发出的原始请求是否已启动使用http或https
传入的https://
请求标头:
{
host: 'whatever.elasticbeanstalk.com',
'x-real-ip': '999.99.99.99',
'x-forwarded-for': '999.99.99.99',
'cache-control': 'max-age=0',
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',
'accept-encoding': 'gzip, deflate, sdch',
'accept-language': 'en-US,en;q=0.8'
}
传入的http://
请求标头:
{
host: 'whatever.elasticbeanstalk.com',
'x-real-ip': '999.99.99.99',
'x-forwarded-for': '999.99.99.99',
'cache-control': 'max-age=0',
accept: 'image/webp,image/*,*/*;q=0.8',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',
'accept-encoding': 'gzip, deflate, sdch',
'accept-language': 'en-US,en;q=0.8',
'if-none-match': '"141699-1446507991000"',
'if-modified-since': 'Mon, 02 Nov 2015 23:46:31 GMT'
}
其中唯一看起来含糊不清的是upgrade-insecure-requests
标题,但基于此
What is the "Upgrade-Insecure-Requests" HTTP header?
我很确定它不是。
也许我错过了一些东西......
答案 0 :(得分:5)
如果问题实际上是“我怎样才能确保通过http访问我的网站的任何人都被重定向到https / ssl”(事实证明这就是我的意思),这是可能
设置Elastic Load Balancer将80上的HTTP转发到实例上的80上的HTTP(而不是之前的80上的TCP),然后将443上的HTTPS转发到实例上的80上的TCP。
“假设HTTPS / SSL”:即检查是否存在x-forwarded-proto
,如果存在,则它来自http请求,因此301来自https。如果一个不存在,假设它是https,不要重定向它(实际上我觉得我不妨检查以确保协议在重定向之前是http,但在当前设置中我很确定这是唯一的情况可能发生的事情。)
答案 1 :(得分:3)
当您使用TCP时,ELB不会注入HTTP标头,例如x-forwarded-proto或x-forwarded-for。您可以通过configuring Proxy Protocol获得所需内容。