前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >负载均衡https转发会让服务器误判

负载均衡https转发会让服务器误判

原创
作者头像
黄希彤
发布2018-04-10 15:03:14
2.1K13
发布2018-04-10 15:03:14
举报
文章被收录于专栏:黄希彤的专栏黄希彤的专栏

腾讯云的负载均衡提供了非常好使的https转发功能,只要把证书配置到负载均衡上面,然后把443端口的请求转发到服务器的http服务端口上就可以透明的提供https服务了。

但是这样做服务器实际上是不知道自己的请求已经转成https了,仍然会误以为自己还在http上工作,这样有时就会触发奇怪的bug。比如php程序通过 $_SERVER['HTTPS'] 这个值是on还是off来高速服务器自己工作在http还是https上,这个时候就会误判。有的时候服务器依赖于这个逻辑,就可能出错。这里有一段discuz的代码:

代码语言:javascript
复制
 $_G['isHTTPS'] = ($_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;
       $_G['scheme'] = 'http'.($_G['isHTTPS'] ? 's' : '');
       $_G['siteurl'] = dhtmlspecialchars($_G['scheme'].'://'.$_SERVER['HTTP_HOST'].$sitepath.'/');

因为discuz不信任所有相对路径,认为所有请求应该在请求前根据各种配置被明确的拼成绝对路径。比如form提交的时候一定要调用一下 ajaxpost 并且在其中调用hostconvert来进行把相对路径转成绝对路径。拼的时候就会去取到这个依据了错误信息被拼错了的siteurl地址,从而导致了跨协议访问的安全警告。

代码语言:javascript
复制
function hostconvert(url) {
	if(!url.match(/^https?:\/\//)) url = SITEURL + url;
	var url_host = getHost(url);
	var cur_host = getHost().toLowerCase();
	if(url_host && cur_host != url_host) {
		url = url.replace(url_host, cur_host);
	}
	return url;
}

解决方案是让discuz不要那么纠结绝对路径,尽量接受当前的协议、当前的端口、当前的域名就好。为了解决跨协议的bug,我们保守的只把代码中处理scheme的部分处理掉,让路径从“//”开始来解决:

代码语言:javascript
复制
//              $_G['siteurl'] = dhtmlspecialchars($_G['scheme'].'://'.$_SERVER['HTTP_HOST'].$sitepath.'/');
//改为相对路径
                $_G['siteurl'] = dhtmlspecialchars('//'.$_SERVER['HTTP_HOST'].$sitepath.'/');

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档