2011-05-06 341 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; 
}