2012-01-11 58 views
1

我在我的計算機上開發的CMS部署到我的第一臺域服務器,我遇到了重定向到PHP中的頁面(使用javascript工作)功能,調用:PHP重定向拉起空白頁面(僅在部署在服務器上時)

header("Location: {$location}"); 

一切工作正常在我的家用機器通過WAMP。但是,我部署在服務器上後,它重定向到一個空白頁面。我曾經在一個單獨的文件測試的問題,並發現它只要只能包含redirect_to的功能包含的文件,所以它看起來是這樣的:

<?php //require_once("includes/session.php");?> 
    <?php require_once("includes/functions.php");?> 
    <?php //require_once("includes/constants.php"); ?> 
    <?php //require_once("includes/connection.php"); ?> 
    <?php 
     define("DB_SERVER", "mysite.ipagemysql.com"); 
     define("DB_USER", "root"); 
     define("DB_PASS", "notreal"); 
     define("DB_NAME", "myCMS"); 

     redirect_to("login.php"); 
     phpinfo(); 
    ?> 

這是我所定義的重定向功能的functions.php:

 // redirects the user to the page/path specified by $location 
    function redirect_to($location){ 
     if($location != NULL){ 
      header("Location: {$location}"); 
      exit(); 
      } 
    } 

請注意,我只能包含functions.php文件,如果我有任何其他重定向不再起作用,只是去到一個空白頁。我可以複製,這是代碼在包含的文件中,像上面用constants.php文件所做的那樣:

 <?php 

      // Database constants 
     define("DB_SERVER", "mysite.ipagemysql.com"); 
     define("DB_USER", "root"); 
     define("DB_PASS", "notreal"); 
     define("DB_NAME", "myCMS"); 
    ?> 

我可以定期從域服務器加載所有CMS頁面,訪問數據庫並保存到它。由於我可以保存到數據庫中,因此我認爲包含我測試的任何文件都沒有問題,因爲它們都是訪問數據庫所需要的。問題純粹是重定向。一切工作正常,它是如何設置爲我的comp作爲localhost運行。

我一直在尋找這個問題,並嘗試解決方案整天。我已縮小到無法包含其他文件的問題,但我不明白爲什麼,它只發生在域服務器上...

任何幫助或見解將不勝感激,謝謝花時間閱讀本文。

+0

打開'error_reporting'(php.ini或index腳本)和/或查看Web服務器'error.log'(如果有空白頁面)。如果它真的只是失敗的重定向,然後看看[頭已經發送](http://stackoverflow.com/questions/8028957/headers-already-sent-by-php) – mario 2012-01-11 01:54:10

回答

1

如果您暫時將錯誤報告轉至E_ALL,可能會有所幫助。看起來你可能有一些輸出從另一個包含文件發送到瀏覽器。通常情況下,輸出很容易錯過,就像關閉後的額外回車一樣? >標籤。最好省略包含文件中的結束標記,因爲它們不是必需的,並且可以防止意外輸出。

如果您收到不可見的輸出,這意味着在發送位置標題時它已經發送,因此它不起作用。

+0

雅,你是對的錯誤報告我只需要弄清楚這個主機上的php.ini文件在哪裏。我是新來的託管在第三方服務器,我剛剛得到它昨天,我一直在我的學校服務器上運行的東西。我將檢查包含文件中的大括號之後是否有回車符。當你說忽略結束標記時,你的意思是把所有包括在一個塊中而不是單個塊中?我只是不明白它是如何在我的本地主機上工作的完美,但是這一件事情在上傳到他們的服務器時不起作用... – 2012-01-11 05:43:15

+0

包含命令仍然可以保持原樣,但包含的文件本身不能有任何輸出。因此,假設包含的文件都是pho代碼,只需在文件末尾刪除結尾標籤。 – davidethell 2012-01-11 07:13:47

0

你在使用Lynda運動文件嗎?必須在PHP之前聲明標題,包括空格。您的其他包含文件中有一些內容違反了針對標頭的PHP規則。你的數據庫常量應該在constants.php中聲明。

如果您使用Lynda ex。文件,我建議移動到下一個級別(我認爲它被稱爲PHP/MySQL超越基礎),那裏有很多有用的代碼片段。

至於解決這個問題,如果你想讓用戶立即重定向到登錄頁面,除了你的函數文件和redirect_to。將另一個包括移動到名爲「initialize.php」的文件中,並將該文件加載到登錄頁面上。

+0

我正在閱讀Lynda教程,但是我沒有練習文件,所以我編碼時一直沿用。然後我將其修改爲我自己的方式,作爲CMS後端集成,以使我的AJAX網站更具動態性。允許訪問者通過表單自定義他們的體驗。 我讀過幾次頭文件必須在任何html渲染之前發生,但不是頭文件調用必須是PHP之前的第一件事,甚至在空間之前。沒有道理的是爲什麼它在localhost上工作,而不是在服務器上工作...... – 2012-01-11 05:29:40

+0

我最好的猜測是,在把代碼放在一起的過程中,'require_once'的順序已經改變了。由於您沒有與遠程服務器之間的現有會話,因此會觸發一些生成輸出的代碼。在本地服務器上工作時,會話可能已建立,因此違規代碼不會生成任何輸出。這只是我最好的猜測,但我肯定會建議將其他初始化文件移動到一個「initialize.php」,並在處理完所有頭文件後再調用它。 – dyelawn 2012-01-11 05:38:08

0

如果取消註釋任何require_onces會導致頁面爲空白,那麼在所需文件中有致命錯誤,或致命錯誤是找不到所需文件。這聽起來像你甚至從來沒有進入redirect_to函數。在你的文件的頂部添加這些線,將提供錯誤的詳細信息:

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

所以,你的代碼看起來像:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

require_once("includes/session.php"); 
require_once("includes/functions.php"); 
require_once("includes/constants.php"); 
require_once("includes/connection.php"); 

define("DB_SERVER", "mysite.ipagemysql.com"); 
define("DB_USER", "root"); 
define("DB_PASS", "notreal"); 
define("DB_NAME", "myCMS"); 

redirect_to("login.php"); 

此外,檢查你是不是定義DB_SERVER,DB_USER,您定義的任何文件(例如constants.php)中的DB_PASS,DB_NAME只能定義一次,並檢查在發送標頭之前沒有輸出任何內容。

並且記住,如果這是一個活動站點,請在解決問題後將display_errors設置爲0。

ini_set('display_errors', 0); 
+0

忽略保羅。在php變量周圍可以使用括號。事實上,有些時候如果變量具有非法字符(例如{$ ADDRESS-STATE}), – 2012-01-11 02:24:32

0

非常感謝您的幫助和洞察力,因爲您的意見,我能夠找出問題所在。首先,它是爲愚蠢的錯誤davidethell指出的,確保沒有PHP的包含文件有空格或返回

before the <?php or after the closing ?> 

然後我跑進我在那裏的每一頁上遇到此錯誤的問題:

Warning: Cannot modify header information - headers already sent by... 

但它是抱怨包含文件中的行號,該行號在實際文件的最後一行之後是3行。我搜索了四周,發現如果在每一個顯示的頁面中我把:

<? ob_start(); ?> 

在文件(之前包括)最開始的,然後在最後我把:

<? ob_flush(); ?> 

那拿了錯誤信息消失,一切仍然正常運行。我沒有花時間去查看這個功能是幹什麼的,我現在要去查看它。我很確定它與緩衝有關。這可以解釋爲什麼它似乎減慢了頁面上的交互,主要是頁面重定向。但那可能只是服務器的滯後。

我是新來的php和部署在我不熟悉的服務器上。希望如果你有類似的問題,你會發現一些有用的。

相關問題