我正在尝试阻止通过HTTPS访问我网站上的某些网页,并且(无论出于何种原因)我想通过PHP而不是通过.htaccess进行访问。
这是我正在使用的代码:
if ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) {
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://mydomain.com");
}
但由于一些奇怪的原因,我陷入无限循环,无法让它发挥作用。当我在firebug中检查响应标头时,我发现location
标头设置为https://mydomain.com
而不是http://mydomain.com
,这导致无限循环。
编辑:直接访问http://mydomain.com
即可。
另请注意:如果我将'发送到其他页面,这是有效的,但如果我将它们发送到同一页面则不行。因此,如果我在mydomain.com/somePage.php
中运行上述代码,然后尝试通过https://mydomain.com/somePage.php
访问它,它将正确地重定向到(非SSL-ed)主页。只有当我使用不同的协议将它们重定向到同一页时,它才会忽略该协议。
我做错了什么?
答案 0 :(得分:3)
事实证明我的代码没有任何问题。服务器刚刚以一种弄乱我的标题的方式设置。我正在使用engineHosting.com,我不得不说:他们非常有帮助。经过大量的反击和与他们一起,这是他们发给我的东西:
我们能够深入了解这个问题并且可以让它(原文如此)修复问题但是修复本身导致了其他问题。让我解释一下。
我们的架构不是大多数Web主机的典型架构。您的帐户实际上由双防火墙,双入侵防御系统,双负载均衡器以及基于SSL硬件加速的角色,前端两个apache Web节点以及庞大的mysql服务器后端托管。
问题在于我们如何在负载均衡器内部进行SSL加速。我们有许多客户想要检测用户何时访问仅用于https的页面,但从不反过来想要检测用户何时在应该重定向到常规http的页面上。因此,我们在负载均衡器上启用了一个名为“仅限http wan优化压缩SSL站点”的选项,当请求URL已启用https时,它还会将出站位置标头重写为https。当您可能有很多链接到动态提供的同一URL上的资产但是不小心将链接写为http时,这很有用。所以这实际上是一个功能,而不是一个错误(是的,我也不喜欢这个短语)。
要解决您的特定用例,我们将您的域的SSL配置文件更改为“正常/非ssl的http压缩”虚拟服务器设置。您可能在过去使用单服务器Web解决方案时未遇到此问题。在此模式下运行的不幸后果是,在服务器级别执行30x重定向以将用户从http重定向到https的另一个用例可能会出现问题,具体取决于重定向的实现方式。为了安全起见,您应该验证您将在实际网站中使用的方法,如果您遇到任何问题,请告诉我。
答案 1 :(得分:0)
不完全确定,但我注意到以下几点:
如果你的.htaccess或服务器配置设置为坚持使用HTTPS,你将无法在php级别解决这个问题。
您在http://mydomain.com上留下了尾部斜线,这会产生隐含的重定向。尝试使用位置中的完整实际路径 - 例如http://mydomain.com/index.html或http://mydomain.com/index.php。
答案 2 :(得分:0)
我有一个运行HTTPS站点的自托管服务器。我做了一些快速测试,你的代码完全符合预期。这是我的代码(逐字,只更改了域名):
redir.php
<?php
if ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) {
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://mydomain.com/redir.php");
exit;
}
if ( !isset($_SERVER['HTTPS']) || !$_SERVER['HTTPS'])
{
echo "IT'S WORKING!";
}
?>
我肯定会说 - 正如Jared Farrish在聊天中所说 - 这是主持人的问题。服务器配置中的某些内容正在强制重定向回HTTPS。我不认为这是一个PHP错误。我的服务器使用Apache 2.2.17运行PHP 5.3.5。