使用SSL在PHP负载均衡器后面重定向循环

Cha*_*had 3 php apache redirect header

当我尝试从SSL加密页面切换回非加密(https - > http)时,我遇到了陷入无限重定向循环的情况.我们当前的配置设置在负载均衡器后面,该负载均衡器创建一个标头:HTTP_X_FORWARDED_PROTO

当它设置为SSL时,它返回"https",oth,它总是返回"http"

我在SSL证书之前在站点上使用的以下代码被移动到负载均衡器而不是站点运行的Web节点.已添加(HTTP_X_FORWARDED_PROTO)以相应地更新脚本.

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])){
    $redirect = '';
    if (!isset($sslPage)){
        $sslPage = false;
    }
    switch($_SERVER['HTTP_X_FORWARDED_PROTO']){
        case 'http' :
            if ($sslPage)
                $redirect = 'location: https://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
            break;  

        case 'https' :
            if (!$sslPage)
                //$redirect = 'location: http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
            break;
    }
    if (!empty($redirect)){
        header ($redirect); 
    }
}
Run Code Online (Sandbox Code Playgroud)

需要ssl打开的每个页面都有一个$ sslPage = true的预加载变量;

所以从http到https的重定向很有用..没问题.但如果我试图倒退它就行不通.我陷入无休止的循环中.我开始认为这是因为apache.由于Web节点不再终止SSL,所有流量都通过端口80运行.当php通过header()进行重定向时,我相信发生的事情是服务器收集请求,因为它是本地的并尝试解析它.由于HTTP_X_FORWARDED_PROTO从未更新,因为它没有再次访问负载均衡器,因此重定向永远不会成功.

我的问题是,如果这是有道理的,或者我对此有何看法?这个电话会不会总是被转发回负载均衡器?如果它确实保留在该Web节点的内部,我该如何强制它返回Load Balancer,以便它可以为它试图检索的页面编写新的标题?

事实证明这令人沮丧....

感谢您的帮助.

Ben*_*ssi 6

您可以通过设置环境变量让Apache 认为 SSL已启用(在PHP逻辑中$_SERVER['HTTPS'])

SetEnvIf X-Forwarded-Proto https HTTPS=On
Run Code Online (Sandbox Code Playgroud)

这应该允许遗留代码在不需要更改的情况下工作.