PHP-将HTTPS重定向到HTTP-无限循环
我试图阻止通过HTTPS访问我网站上的某些页面,并且(出于任何原因)我希望通过PHP而不是通过.htaccess来访问 以下是我使用的代码:PHP-将HTTPS重定向到HTTP-无限循环,php,apache,redirect,https,http-headers,Php,Apache,Redirect,Https,Http Headers,我试图阻止通过HTTPS访问我网站上的某些页面,并且(出于任何原因)我希望通过PHP而不是通过.htaccess来访问 以下是我使用的代码: if ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) { header("HTTP/1.1 301 Moved Permanently"); header("Location: http://mydomain.com"); } 但出于某种奇怪的原因,我被困
if ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) {
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://mydomain.com");
}
但出于某种奇怪的原因,我被困在一个无限循环中,无法让它工作。当我检查firebug中的响应头时,我看到位置
头被设置为https://mydomain.com
而不是http://mydomain.com
,导致无限循环
编辑:访问http://mydomain.com
直接起作用
另外请注意:如果我将它们发送到另一个页面,这是有效的,但如果我将它们发送到同一个页面,则不起作用。因此,如果我在mydomain.com/somePage.php中运行上述代码,然后尝试通过https://mydomain.com/somePage.php
,它将正确重定向到(非SSL ed)主页。只有当我将它们重定向到具有不同协议的同一页面时,它才会忽略该协议
我做错了什么?不完全确定,但我注意到以下几点:
如果您的.htaccess或服务器将其配置为坚持使用HTTPS,您将无法在php级别绕过它
您省略了创建隐含重定向的尾部斜杠。使用位置中的完整实际路径进行尝试——例如
我有一个运行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!";
}
?>
原来我的代码没有问题。服务器只是以一种干扰我的头的方式设置的。我正在使用,我不得不说:它们非常有用。在与他们进行了多次交流之后,他们给我的信息如下:
我们能够找到问题的症结所在,并可能让它(原文如此)解决了问题,但修复本身和我的原因是其他问题。让我解释一下
我们的体系结构不是大多数web主机的典型结构。您的帐户实际上由两个防火墙、两个入侵预防系统、两个负载平衡器托管,它们还执行基于SSL硬件的加速、两个apache web节点的前端和一个大型mysql服务器后端
问题在于我们如何在负载平衡器中进行SSL加速。我们有许多客户端希望检测用户何时访问仅用于https的页面,但决不会与检测用户何时访问应重定向到常规http的页面相反。因此,我们在负载平衡器上启用了一个名为“仅限http wan优化压缩SSL站点”的选项,当请求url已启用https时,该选项还将出站位置头重写为https。当您可能在同一URL上有许多指向资产的链接,这些链接是动态提供的,但意外地将链接写入http时,这非常有用。所以这实际上是一个特性,而不是一个bug(是的,我也不喜欢这个短语)
为了解决您的特定用例,我们将您的域的SSL配置文件更改为“针对正常/非SSL的http压缩”虚拟服务器设置。您在过去使用单服务器web解决方案时可能没有遇到过此问题。在此模式下操作的不幸后果是,在服务器级别执行30倍重定向以将用户从http重定向到https的另一个用例可能会出现问题,具体取决于重定向的实现方式。为了安全起见,您应该验证将在您的live站点中使用的方法,如果遇到任何问题,请告诉我
这是一个打字错误,它说的是标题(“位置:http://
”,而不是标题(“位置:https://
…或者代码实际上就是这么说的?@Dennis:对不起,你是对的。误读了。我会在你的代码中寻找导致从http->https重定向的其他地方。你在httpd.conf/.htaccess中有什么吗?或者在其他地方有另一个PHP块吗?你需要isset
还是如果(!empty($\u SERVER['https']))
够了吗?我不确定您是否需要在isset
和==“on”
上加倍。如果不是https,$\u服务器['https']var将为空,所以只需检查单个变量的值就可以了-至少我会这么认为。我现在没有一台启用HTTPS的服务器可以测试。如果删除301
头会怎么样?奇怪。如果明天没有答案,我将在工作中的服务器上测试它,看看会发生什么。你会吗.htaccess从脚本发送头后重定向?1)不。正如我在问题中所说,访问http://mydomain.com
直接工作很好。2)我在主页上运行此功能,我不希望它们被重定向到那里。3) 隐含重定向
意味着什么?隐含重定向意味着没有名为“mydomain.com”的文件。服务器识别出这一点并为您添加斜杠,然后使用配置中的规则搜索默认目录文件。这就是web服务器的工作方式,这可能是几个重写步骤,这些步骤提供了一个机会,可以在其中添加https:设置,如果它是服务器的默认设置的话。最好是直言不讳,不要指望隐藏的东西做你所期望的,尤其是当它们不是的时候。嘿,这个“功能”花了我一个上午的时间。谢谢你发这个。@Populus-你也在使用engineHosting吗?