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

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

我想将已登录的用户推送到 HTTPS,但让未登录的用户继续使用 HTTP(已设置 https)。我从另一个 SO post 中获取了这段代码片段(很抱歉我现在找不到要引用的 post )并将其嵌套在 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 post 我最初从以下位置获取此代码:

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

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

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

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