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