2009-08-10 41 views
5

如何在PHP中使用下面的設置重定向而不會出現頭部輸出錯誤,我明白,在設置頭部之前沒有任何東西可以打印到瀏覽器,我正在尋找解決方案,而不是解釋爲什麼會發生請。如何在PHP中重定向而不發生標題錯誤?

<?PHP 
// include header 
include ('header.inc.php'); 



// In my body section file if this is a page that requires a user be logged in then 
// I run a function validlogin($url-of-page-we-are-on); inside of that file 
//the function is below, it outputs a redirect to login page if not logged in 

// include body of page we want 
include ('SOME-FILE-HERE.php'); 



// include footer 
include ('footer.inc.php'); 



// here is the function that is in the body pages, it is only called on a page that we require a logged in user so there are hundreds of pages that do have this and a bunch that don't, it's on a page to page basis 
function validlogin($url) { 
    if ($_SESSION['auto_id'] == '') { 
     $msg = 'Please login'; 
     $_SESSION['sess_login_msg'] = $msg; 
     $_SESSION['backurl'] = $url; 
     $temp = ''; 
     header("Location: /"); 
     exit(); 
    } 
} 
?> 

我想用戶PHP的頭功能,而不是一元或JavaScript重定向

而且,這裏maintainning的需要登錄與否頁面的列表不是一個選項,如果可能的

回答

2

你就不能做到這一點:

<?php 
validlogin($url); // call the function here 
include ('header.inc.php'); 
include ('SOME-FILE-HERE.php'); 
include ('footer.inc.php'); 
?> 

或者,把包含文件在「一些-FILE-HERE」類型的文件中的每一個,如果可能的話,那麼你最終:

<?php 
validlogin($url); // call the function here 
include ('header.inc.php'); 
?> 

<h1>Page heading</h1> 
...page content etc... 

<?php 
include ('footer.inc.php'); 
?> 
+0

這就是我所做的,閱讀我的問題的更新部分 – JasonDavis 2009-08-10 23:31:40

+0

對不起,II有關於同一問題的另一個問題,我沒有意識到我是在這個問題上,反正這就是我最終完成它的方法,它工作得很好 – JasonDavis 2009-08-10 23:33:02

10

使用ob_start ()在第一行甚至包括。所以你可以隨時設置標題。

+0

ob_start()不解決這個問題,但我不喜歡使用它,我想我需要了解它是如何工作的更好,這需要整個網頁保存到內存,而不是僅僅顯示它c orrect? – JasonDavis 2009-08-10 15:41:24

+0

不是直接。 PHP在任何時候都使用輸出緩衝區。但它工作不一樣。普通緩衝區可以隨時刷新到瀏覽器。 使用outputbuffering只有一個缺點,你不能全部使用flush()。 – Rufinus 2009-08-10 17:11:00

0

只要在header()函數之前沒有腳本輸出,你應該沒問題。檢查沒有回聲或空白。在開始處放置ob_start()也可以提供幫助。有時會有不可見的空白 - 將文檔格式更改爲ANSI或Unicode可能會有所幫助!

作爲一個說明(儘管我認爲你已經知道)頭並不終止腳本,所以exit()(你有)是一個明確的要求。

+0

那裏是輸出,在我的例子中,我的整個頭文件被輸出,然後我知道我是否在需要登錄的頁面上。 – JasonDavis 2009-08-10 15:34:57

+0

當然應該在標題被包含之前調用validlogin()函數,然後呢? – Meep3D 2009-08-10 18:58:40

+0

不可能,因爲我也提到過,並非所有頁面都需要登錄並且頁面是動態構建的 – JasonDavis 2009-08-10 20:35:28

0

footer.inc.php和SOME-FILE-HERE.php是否立即寫入響應流?因爲如果是這樣,這將不起作用,因爲在發送標題之前,您已經寫了一些東西。

+0

,現在您明白了這個問題=) – JasonDavis 2009-08-10 15:35:35

+0

啊,那麼,這就變得更具挑戰性了:) 有一個函數,不能,在我的生活中記住它,迫使處理器緩存響應,直到你發出命令發送它所有的,我會盡力爲你看,因爲這可能會解決你的問題... – 2009-08-10 20:06:41

+0

jasondavis, Gumbo的答案是正確的,但請確保在腳本末尾調用ob_end_flush()以發送緩衝的響應流。基本上, ob_start(); //你的所有代碼都包括 ob_end_fush(); – 2009-08-10 22:22:17

0

您需要緩衝輸出,以便HTTP頭不會在第一個輸出上發送。您可以通過啓用ouput_buffering或通過調用ob_start明確地緩衝任何輸出。但後者必須在第一個輸出之前被調用,所以理想情況下在最初調用的腳本的第一行。

2

使用{ echo '<META HTTP-EQUIV="Refresh" Content="0; URL=process.php">';}