切换 HTTPs 碰到的一个小问题

问题描述:
在岁宝做全站https切换的时候,碰到了一个问题, 未登录情况下,点击需要登录权限的菜单,redirect url的协议头变回了http, 情况类似这样: 

https://www.ishirble.com/login?target=http://www.ishirble.com/user/index

所以在登录后,协议就变回了http
问题原因:
查了代码发现这个redirect url是后端定义的,后端的代码中则是根据request.getScheme()来获取请求头的。这种获取的方式并没有错,所以错误的原因可能是在web server之前,请求头就已经被重置为http了。

具体过程如图所示: ssl-lb-strategy.png

所有请求在经过ssl这层的时候,协议都会变为http。

解决办法:
现在知道了原因,解决的办法也比较简单,就是在ssl把协议抹去之前,通过另一种方式记录下来,在request header中添加一个变量。

一般都会用 x-forwarded-proto 来记录本来的请求协议。如果你的ssl证书放在自己的服务器上面,可以在nginx中加入如下配置:

x_forwarded_proto_local

如果你的ssl放在第三方平台上面,这里以阿里云和腾讯云为例。
阿里云SLB的高级配置中已经提供了这个配置选项,如下图所示:

x_forwarded_proto_aliyun

腾讯云的LB并没有提供写request header的功能。但是,可以通过监听2个不同的端口(一般是80,443)分别对应http,https的请求,然后只需在每个监听端口写死http或者https即可。配置如下:

80端口写死http
x_forwarded_proto_qcloud_80 443端口写死https
x_forwarded_proto_qcloud_443

那问题到这里就完美解决啦!

杨哲峰

Read more posts by this author.

Subscribe to The Terminus Blog

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!