2009-08-10 97 views
3

在PHP文件中,當我需要重定向一個用戶和標題已經發送,所以我不能使用PHP的頭功能,在這種情況下,這是最好的方法來重定向用戶?最好的重定向方法?

最快和最可靠的方法,無論用戶的瀏覽器品牌?

echo '<script type="text/javascript">window.top.location="http://localhost/";</script>'; 

// OR 

echo '<meta http-equiv="refresh" content="0;url=' .$location. '">'; 

UPDATE

這裏是我的,我不能重定向到網頁最終結果的代碼,我現在使用的,如果頭部已經發送的,我只是把網頁給我,這樣反而包括正文頁面,它將包括我的主頁和頁腳

function validlogin($url) { 
    if (!isset($_SESSION['auto_id']) || ($_SESSION['auto_id']=='')) { 
     $_SESSION['sess_login_msg'] = 'Please login'; 
     $_SESSION['backurl'] = $url; 
     $temp = ''; 
     if (headers_sent() === false){ 
      header("Location: /"); 
      exit(); 
     }else{ 
      //header is already sent so we will just bring the homepage to us instead of going to it!!! 
      include 'mainbody.inc.php'; 
      include 'footer.inc.php'; 
      exit(); 
     } 
    } 
} 

回答

4
function Redirect($url, $permanent = false) 
{ 
    if (headers_sent() === false) 
    { 
     header('Location: ' . $url, true, ($permanent === true) ? 301 : 302); 
    } 

    exit(); 
} 

Redirect('http://www.google.com/', false); 

再次,使用ob_start();

+0

這對我的解決方案來說是正確的,IDK爲什麼有人會對每個不說「輸出緩衝」的人進行低調投票,我有一個好主意。看看你的方法,我可以添加到我現有的功能,如果頭已經發送,那麼我可以包括我的主頁,而不是重定向到它,偉大的解決方案! – JasonDavis 2009-08-10 16:36:20

+0

我聲稱我的所有記錄都是備案的。你包括方法看起來會很好。在這篇文章的開頭,我們只知道你想重定向。更多信息總是更好:) – 2009-08-10 16:53:57

-1

我會說第二個。

如果用戶禁用JavaScript,或者使用瀏覽器而不使用JavaScript,則第1次重定向將無法使用。

+0

您可能還想看看PHP中的輸出緩衝。這將允許您使用服務器端重定向。 http://us2.php.net/manual/en/ref.outcontrol.php – easement 2009-08-10 13:58:04

+0

不知道meta重定向是否一直支持? – JasonDavis 2009-08-10 14:22:42

+1

無論哪種方式,他們都殺死後退按鈕。 – 2009-08-10 14:32:46

7

不要使用任何這些!你應該總是使用HTTP重定向。

使用ob_start()緩衝內容並避免已發送標題的問題。

您也可以嘗試編寫MVC應用程序,在這裏您可以知道在輸出任何內容之前是否需要重定向(但不需要使用ob_start())。

+0

我同意。您應該能夠控制應用程序的輸出並使用HTTP標頭。如果你絕對不能這樣做,請使用第二個選項。對此答案+1。 – 2009-08-10 14:02:05

+0

我不知道很多關於ob緩衝區是如何工作的,但是在顯示之前沒有把整個頁面放到內存中,這對於在高流量網站上的性能不是很好嗎? – JasonDavis 2009-08-10 14:31:30

+0

一些測試發現很多小的輸出比較大的批次iirc要慢。需要一些Google搜索或測試。 – OIS 2009-08-10 15:29:42

2

小豬回porneL:

巨大的問題,您的方法:你殺後退按鈕。殺死後退按鈕是網絡上最刺激的事情。

我從來沒有發現需要在標題發送後重定向。你應該重新考慮你想要做的事情。

+1

我完全同意。如果您在輸出內容後需要發送標題,那麼您就錯了。 – usoban 2009-08-10 14:40:45

+0

在我的情況下,我重定向的唯一時間是在提交表單或用戶註銷後,我重定向到登錄頁面,因此不應該使用後退按鈕 – JasonDavis 2009-08-10 15:10:42

+0

也是頭髮送的原因是,我有一個頭文件在每個單獨的頁面,然後我有包含在頭下面的正文文件,現在只有一些頁面需要用戶登錄,所以在這些頁面上我調用了一個函數,檢查是否登錄,如果不是,它試圖重定向,因爲它在身體文件中,所以在它可以看到它是否需要重定向 – JasonDavis 2009-08-10 15:12:52