繁体   English   中英

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

[英]Redirect Loop in PHP behind a Load Balancer with SSL

当我尝试从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); 
    }
}

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

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

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

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

感谢您的帮助。

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

SetEnvIf X-Forwarded-Proto https HTTPS=On

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

我们刚刚遇到类似的东西,发现我们的Zeus负载均衡器干扰了响应头。 我们发现,如果初始请求是在https上进行的,并且返回到非安全页面,那么发送回的任何301/302标头都会被负载均衡器修改。

例如,如果客户端请求https://site.com并且我们使用302重定向到http://site.com ,则返回到客户端的结果将具有“ Location: https//site.com ”,因为负载均衡器已将其切换回来(而不是预期的“ 位置: http//site.com ”)

通过在负载平衡器中关闭此功能解决了这个问题。

希望有助于某人 - 尝试并深入了解这是一个令人讨厌的问题!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM