【问题标题】:Redirect HTTPS to HTTP将 HTTPS 重定向到 HTTP
【发布时间】:2011-05-06 11:57:04
【问题描述】:

我们无法解决的非常简单的问题。以下代码未正确重定向:

$location = str_replace("http","https",$this->page->current_url);
header( "Location: ".$location );

我收到 400 错误:“您的浏览器发送了此服务器无法理解的请求。 原因:您对启用 SSL 的服务器端口使用纯 HTTP。请改为使用 HTTPS 方案访问此 URL。"

我如何在 PHP 中从通过 HTTPS 提供的页面重定向到通过 HTTP 提供的页面以用于安全登录等场景,然后重定向到不安全的应用页面?

【问题讨论】:

  • 先基本调试。替换后$location 包含什么?
  • 您使用的是哪个网络服务器?
  • 在这个话题上没有太多经验,也许在这里添加端口会有所帮助。意义; https://host/path --> http://host:80/path。鉴于您提供的信息,听起来浏览器并未切换到 http 端口,而是继续与 https 端口通信。
  • @Harism 这就是我的想法,但是是的,输出 $location 字符串以查看发生了什么
  • Pekka - Duh - 我不知道为什么我没有查看 $location。它包含无效的 http//localhost:443/[...]。我只需删除 :443 就可以了。

标签: php


【解决方案1】:

试试这个,对我来说效果很好

<?php
if  ( $_SERVER['HTTPS'] )
    {
            $host = $_SERVER['HTTP_HOST'];
            $request_uri = $_SERVER['REQUEST_URI'];
            $good_url = "http://" . $host . $request_uri;

            header( "HTTP/1.1 301 Moved Permanently" );
            header( "Location: $good_url" );
            exit;
    }
?> 

【讨论】:

    【解决方案2】:

    这适用于 http 到 https 和 https 到 http(使用一些调整来检查)

    首先检查您的主机上的 https 是否打开,如果是,然后使用下面提到的 PHP 函数将 URL 重定向到 https

    function httpToHttps() 
    {
        $pageURL = 'http';
        if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
        $pageURL .= "://";
        if ($_SERVER["SERVER_PORT"] != "80") 
        {
    
    
        $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
    
        } 
        else 
        {
    
        $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_UR
    
    I"];
        }
        return $pageURL;
    }
    

    【讨论】:

      【解决方案3】:
          if( isset($_SERVER['HTTPS'] ) ) {
          header( "Location:foo.php");
      

      【讨论】:

        【解决方案4】:

        不确定这是否会导致这样的问题,但您应该在调用 header 函数后添加一个 exit。这可以确保以下代码不会被执行,并且 HTTPS 请求本身不会返回任何数据。应该在返回任何内容之前调用 header 函数。

        $target = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        header('Location: '.$target, true, 303);
        exit;
        

        【讨论】:

        • 这样的事情可能会奏效。我没有受过教育的猜测是问题在于http-keep-alive。在这种情况下,这会导致浏览器使用现有的 https 连接,而它应该打开一个新的 http 端口。
        【解决方案5】:

        Duh - 我不知道为什么我没有查看 $location。它包含无效的 http//localhost:443/[...]。我只需删除 :443 就可以了。

        【讨论】:

        • @Mat:似乎没有与此匹配的另一个答案。
        猜你喜欢
        • 2017-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2013-11-05
        • 2012-11-02
        • 2011-03-29
        • 2018-02-02
        相关资源
        最近更新 更多