Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-将HTTPS重定向到HTTP-无限循环_Php_Apache_Redirect_Https_Http Headers - Fatal编程技术网

PHP-将HTTPS重定向到HTTP-无限循环

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"); } 但出于某种奇怪的原因,我被困

我试图阻止通过HTTPS访问我网站上的某些页面,并且(出于任何原因)我希望通过PHP而不是通过.htaccess来访问

以下是我使用的代码:

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吗?