【问题标题】:Force HTTP to HTTPS through an AWS EC2 load-balancer通过 AWS EC2 负载均衡器强制 HTTP 到 HTTPS
【发布时间】:2015-11-13 14:55:55
【问题描述】:

我们有一个 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

【问题讨论】:

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


【解决方案1】:

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

    }

【讨论】:

    【解决方案2】:

    使用以下规则:

    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

    【讨论】:

      【解决方案3】:

      https://stackoverflow.com/questions/5106313/redirecting-from-http-to-https-with-php

      所以,从上面的链接中,我在所有其他文件调用的 header.php 文件中使用了这个 PHP 代码:

      <?php
      if (!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || 
         $_SERVER['HTTPS'] == 1) ||  
         isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&   
         $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
      {
         $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
         header('HTTP/1.1 301 Moved Permanently');
         header('Location: ' . $redirect);
         exit();
      }
      ?>
      

      这将所有请求更改为 HTTPS,并且似乎涵盖了所有基础

      【讨论】:

        猜你喜欢
        • 2017-02-19
        • 2015-03-18
        • 2022-12-05
        • 2017-01-16
        • 2017-12-27
        • 2018-12-15
        • 2014-08-27
        • 2015-05-22
        • 1970-01-01
        相关资源
        最近更新 更多