2011-05-06 340 views
1

非常简单的问题,我们无法解决。下面的代码不正确重定向:将HTTPS重定向到HTTP

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

我得到一个400错误:“您的浏览器发送的请求,该服务器无法理解 原因:你是说普通的HTTP启用了SSL,服务器端口请使用HTTPS方案访问此URL。“

如何将PHP从通过HTTPS提供的页面重定向到通过HTTP提供的页面,以进行安全登录等情景,然后重定向到不安全的应用程序页面?

+2

首先进行基本调试。做完替换后,'$ location'包含了什么? – 2011-05-06 11:58:04

+0

你正在使用哪个网络服务器? – Christopher 2011-05-06 11:58:44

+1

没有太多关于这个话题的经验,可能在这里添加了端口。含义; 'https:// host/path' - >'http:// host:80/path'。鉴于您提供的信息,它听起来像浏览器不切换到http端口,但继续与https端口通信。 – harism 2011-05-06 12:00:01

回答

0

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

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

这样的事情可能会诀窍。我的未受教育的猜测将会是[http-keep-alive]内的问题(http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Persistent_connections)。在这种情况下导致浏览器使用现有的https连接,而应该打开一个新的http端口。 – harism 2011-05-06 13:48:09

1
if(isset($_SERVER['HTTPS'])) { 
    header("Location:foo.php"); 
0

咄 - 我不知道为什么我没有看$位置。它包含http // localhost:443/[...],这是无效的。我只是删除:443,它工作正常。

+0

@Mat:似乎没有与此匹配的另一个答案。 – 2011-05-08 16:59:01

2

试试这个,对我来说工作正常

<?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; 
}