1 问题描述
将 DataEase 的公共链接嵌入到其它系统中去,其它系统使用的浏览器协议为 HTTPS,因此对 DataEase 也配置了 HTTPS 证书,通过 HTTPS 访问 DataEase,实测发现,在通过 HTTPS 协议请求 DataEase 的公共链接后,会 302 重定向到一个 HTTP 协议的请求,如图所示:
2 解决方案
分析:DataEase 在后端代码里会对公共链接做一些加解密的处理,最终会重定向到一个新的地址,这也是这个请求 302 的原因。代码里进行 redirect 时,使用的是一个相对地址,因此问题的根源就在与,虽然在 DataEase 上层做了 HTTPS ,但是并没有去转发请求协议至 DataEase ,这里就涉及到一个很重要的参数:X-Forwarded-Proto,解释如下:
X-Forwarded-Proto:(XFP) 是一个事实上的标准首部,用来确定客户端与代理服务器或者负载均衡服务器之间的连接所采用的传输协议(HTTP 或 HTTPS)。在服务器的访问日志中记录的是负载均衡服务器与服务器之间的连接所使用的传输协议,而非客户端与负载均衡服务器之间所使用的协议。为了确定客户端与负载均衡服务器之间所使用的协议, X-Forwarded-Proto 就派上了用场。
因此我们做如下调整,如果是使用了 SLB 做请求的转发,那么在 SLB 上找到 HTTP 头相关的参数,勾选上 X-Forwarded-Proto ,以阿里云为例,如下所示:
如果是使用了 Nginx 做请求的转发,那么在 Nginx 的 server 配置中添加如下的参数配置:
proxy_set_header X-Forwarded-Proto $scheme;