通过AWS EC2负载均衡器强制HTTP到HTTPS

时间:2015-08-20 05:32:15

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

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

问题是我无法访问负载均衡器,但我仍然需要将非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仍然是on

2 个答案:

答案 0 :(得分:4)

我能够在AWS docs 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;
        }

    }

答案 1 :(得分:2)

使用以下规则:



example.com/new/it/keyword