在对使用Symfony框架做的项目进行排查,用户使用的https访问的请求,经过公司负载均衡后请求到达symfony框架都是HTTP,此时symfony框架底层获得的当前请求就成了http,于是框架中处理的所有跳转就都转向http请求了。本文地址:http://www.04007.cn/article/774.html,未经许可,不得转载.
经过了解发现一般proxy发过来的HTTP_X_FORWARDED_PROTO字段可以准确判断是否是https,而我在线上调试发现在$_SERVER中本身已经在存HTTP_X_CLIENT_SCHEME这个字段,其已记录了用户请求的http/https。在此种情况下建议使用以下方法来判断用户是否是https,如下:本文地址:http://www.04007.cn/article/774.html,未经许可,不得转载.
#提取当前是http还是https请求 function getScheme() { $proto = $_SERVER['HTTP_X_FORWARDED_PROTO'] ?? ''; !$proto && $proto = $_SERVER['HTTP_X_CLIENT_SCHEME'] ?? '' ; !$proto && $proto = $_SERVER['REQUEST_SCHEME'] ?? '' ; $proto = strtolower($proto); !in_array($proto, array('http', 'https')) && $proto = 'http'; return $proto; } define(REQUEST_SCHEME, getScheme());本文地址:http://www.04007.cn/article/774.html,未经许可,不得转载.
在Symfony框架中,其底层是通过HTTP_X_FORWARDED_PORT和HTTPS字段来取得的当前请求http/https,如有上面类似的情况需要处理的话,可以在框架入口文件根据当前真实请求是否是https进行设置以上两个字段,从而避免去查找框架底层以及对其修改,而且关键是很有可能框架底层有不止一个地方去读取的这两个字段,那样要改就累了,所以简洁高效的实现如下:本文地址:http://www.04007.cn/article/774.html,未经许可,不得转载.
#symfony框架对https的调用 if(REQUEST_SCHEME == 'https') { $_SERVER['HTTP_X_FORWARDED_PORT'] = 443; $_SERVER['HTTPS'] = 'on'; }本文地址:http://www.04007.cn/article/774.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/774.html 未经许可,不得转载. 手机访问本页请扫描下方二维码:
|