php - 通过 AWS EC2 负载均衡器将 HTTP 强制转换为 HTTPS

标签 php .htaccess ssl amazon-web-services amazon-ec2

我们有一个 AWS EC2 负载均衡器,它上面安装了 SSL 证书。但是池中的服务器仍在端口 80 和非 SSL 协议(protocol)上运行。

问题是我无权访问负载均衡器,但我仍然必须将非 SSL 流量路由到安全的 HTTPS。我尝试在 htaccess 中添加以下内容,但它不起作用且无法理解,这是因为服务器仍在 HTTP 上运行。

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

我在 PHP 代码中尝试了同样的事情,但也没有用。

if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") {
        $url = "https://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
        redirect($url);
        exit;
    }

因此,我了解到服务器仍在 HTTP 上运行,并且证书仅应用于负载均衡器。在这种情况下强制进行此类重定向的最佳解决方案是什么。我能想到的一种解决方案是解析代码中的 URL 以查看其中是否有 http:// 并重定向。这可能有效,但我真的不认为它是一个干净的最终解决方案。 AWS EC2 有没有办法以这种方式重定向?我不熟悉 AWS EC2。

此外,是否有任何服务器参数可能表明服务器正在端口 80 上运行但 HTTPS 仍开启

最佳答案

我能够在 AWS 文档中找到解决方案 here .

它表示 AWS 负载均衡器将以下服务器变量转发到池中。

X-Forwarded-Proto specifies the protocol (“http” or “https”) of the original request made to the Elastic Load Balancer.
X-Forwarded-Port specifies the port of the original request.

因此,由于我们使用的是 AWS EC2,它可以解决问题,但请小心使用,以防您使用其他环境,因为它们可能不存在。

完整代码为:

if(isset($_SERVER['HTTP_X_FORWARDED_PROTO'])){

        if ($_SERVER['HTTP_X_FORWARDED_PROTO']=="http") {
            $url = "https://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
            redirect($url);
            exit;
        }

    }

关于php - 通过 AWS EC2 负载均衡器将 HTTP 强制转换为 HTTPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32110225/

相关文章:

php - mysql子查询计数位置和分组依据

php - 如何通过指定 .php 文件名在重写规则中传递参数?

c# - .net 4.5.2 和 SSL 3.0

php - 通过 pdo 让 MDB2 与 sqlite3 一起工作

php - Å 与 å 在 mysql 查询中不匹配 - 如何进行不区分大小写的匹配

php - 它只发布 "array"的值,而不是预期值

php - 正确设置 php,例如通过 .htaccess 添加多个 php 版本支持

添加此 .htaccess 后,PHP 方法 ="post"停止工作...为什么?

perl - 如何让 Frontier::Client/LWP 停止验证 CGI::Application Web 应用程序中的 SSL 证书?

git - SSL证书: self signed certificate when cloning repo from github?如何解决