为什么这个 PHP 代码片段将登录名推送到 HTTPS 会导致重定向循环


Why does this PHP code snippet pushing logins to HTTPS cause a redirect loop?

我想将我的登录用户推送到 HTTPS,但让未登录的用户保留在 HTTP 上(https 已经设置好了)。我从另一个 SO 帖子中获取了这个代码片段(抱歉我现在找不到要引用的帖子)并将其嵌套在 if($loggedin) 条件中,以便非登录用户不必使用 https。我所有的路径在网站上都是相对的。

if($loggedin)
    {
    if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
        if(!headers_sent()) {
            header("Status: 301 Moved Permanently");
            header(sprintf(
                'Location: https://%s%s',
                $_SERVER['HTTP_HOST'],
                $_SERVER['REQUEST_URI']
            ));
            exit();
        }
    }
}

我尝试在函数中放入一些 javascript 警报,但是当我加载页面时,我从未看到警报,而是直接转到重定向错误消息。我不知道这是否相关,但我正在使用 AWS 上的 apache 服务器进行弹性负载平衡

关于我可能在这里做错了什么的任何想法?或者由于我的 JavaScript 警报没有显示而导致的故障排除提示?谢谢。

编辑:我

找到了我最初从中获取此代码的SO帖子:使用 .htaccess 和 mod_rewrite强制使用 SSL/https

您的问题中没有足够的信息,但您在一条评论中提到您正在使用负载均衡器。

如果您要在负载均衡器上终止 SSL,但在 ELB 和实例之间使用 HTTP,则此检查将始终失败:

if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {

相反,您需要检查X-Forwarded-Proto以查看原始请求是否为 HTTPS。