我想将我的登录用户推送到 HTTPS,但让未登录的用户保留在 HTTP 上(https 已经设置好了)。我从另一个 SO 帖子中获取了这个代码片段(抱歉我现在找不到要引用的帖子)并将其嵌套在 if($loggedin) 条件中,以便非登录用户不必使用 https。我所有的路径在网站上都是相对的。
if($loggedin)
{
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
if(!headers_sent()) {
header("Status: 301 Moved Permanently");
header(sprintf(
'Location: https://%s%s',
$_SERVER['HTTP_HOST'],
$_SERVER['REQUEST_URI']
));
exit();
}
}
}
我尝试在函数中放入一些 javascript 警报,但是当我加载页面时,我从未看到警报,而是直接转到重定向错误消息。我不知道这是否相关,但我正在使用 AWS 上的 apache 服务器进行弹性负载平衡
。关于我可能在这里做错了什么的任何想法?或者由于我的 JavaScript 警报没有显示而导致的故障排除提示?谢谢。
编辑:我找到了我最初从中获取此代码的SO帖子:使用 .htaccess 和 mod_rewrite强制使用 SSL/https
您的问题中没有足够的信息,但您在一条评论中提到您正在使用负载均衡器。
如果您要在负载均衡器上终止 SSL,但在 ELB 和实例之间使用 HTTP,则此检查将始终失败:
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
相反,您需要检查X-Forwarded-Proto
以查看原始请求是否为 HTTPS。