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

时间:2022-05-07
本文章向大家介绍负载均衡https转发会让服务器误判,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

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

 $_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地址,从而导致了跨协议访问的安全警告。

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的部分处理掉,让路径从“//”开始来解决:

//              $_G['siteurl'] = dhtmlspecialchars($_G['scheme'].'://'.$_SERVER['HTTP_HOST'].$sitepath.'/');
//改为相对路径
                $_G['siteurl'] = dhtmlspecialchars('//'.$_SERVER['HTTP_HOST'].$sitepath.'/');