xma*_*tro 4 php .htaccess ssl amazon-ec2 amazon-web-services
我们有一个 AWS EC2 负载均衡器,并且上面安装了 SSL 证书。但是池中的服务器仍然在端口 80 和非 SSL 协议上运行。
问题是我无权访问负载平衡器,但我仍然必须路由非 SSL 流量以保护 HTTPS。我尝试在 中添加以下内容,htaccess
但它不起作用并且可以理解,这是因为服务器仍在 HTTP 上运行。
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Run Code Online (Sandbox Code Playgroud)
我在 PHP 代码中尝试了同样的事情,但也没有用。
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") {
$url = "https://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
redirect($url);
exit;
}
Run Code Online (Sandbox Code Playgroud)
所以,我知道服务器仍在 HTTP 上运行,并且证书仅应用于负载平衡器。在这种情况下强制进行此类重定向的最佳解决方案是什么。我能想到的一种解决方案是解析代码中的 URL 以查看它是否http://
存在并重定向。这可能有效,但我真的不认为它是一个干净的最终解决方案。AWS EC2 有没有办法以这种方式重定向?我不熟悉 AWS EC2。
另外,是否有任何服务器参数可能表明服务器正在端口 80 上运行,但 HTTPS 仍然是on
?
我能够在此处的AWS 文档中找到解决方案。
它说 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.
Run Code Online (Sandbox Code Playgroud)
因此,由于我们使用的是 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;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3089 次 |
最近记录: |