
幾年前,我工作室裡有人設計了一個網頁,現在客戶決定更換伺服器(他遷移到運行 Gen2 SMP、64 位元、PHP 版本 5.3.8、標準 MYSQL 版本 5 的 Linux Apache 伺服器)。它突然開始做一些奇怪的事情。
當點擊需要登入的連結時,頁面將使用header()
PHP 中的函數將您重定向到登入頁面。奇怪的是,該頁面顯示了這樣的內容:
好的
伺服器遇到內部錯誤或設定錯誤,無法完成您的請求。請聯絡伺服器管理員,[未給予位址]並告知他們錯誤發生的時間,以及您可能執行的任何操作可能導致錯誤。有關此錯誤的更多資訊可在伺服器錯誤日誌中找到。 HTTP/1.1 200 OK 日期:2012 年10 月15 日星期一17:27:32 GMT 伺服器:Apache/2.2.22 (Unix) FrontPage/5.0.2.2635 X-Powered-By:PHP/5.3.8 到期: 11 月19 日星期四1981 08:52:00 GMT 快取控制:無儲存、無快取、必須重新驗證、後檢查=0、預檢查=0 Pragma:無快取保持活動:逾時=5、最大值=399連接:保持活動傳輸編碼:分塊內容類型:text/html 232c
然後是頁面本身,然後是另一個標題:
0 1f4
好的
伺服器遇到內部錯誤或設定錯誤,無法完成您的請求。請聯絡伺服器管理員,[未給予位址]並告知他們錯誤發生的時間,以及您可能執行的任何操作可能導致錯誤。有關此錯誤的更多資訊可在伺服器錯誤日誌中找到。 0
最有趣的是,如果您刷新頁面或在 URL 上按 Enter 鍵,它就會正確載入。我一直在檢查日誌,它只是歸咎於不存在的圖示。我還檢查了 .htaccess,一切都是正確的(RewriteBase 是 / 按預期進行的,唯一的東西是另一個規則將 ^en/ 請求移動到 request?lang=en。有人遇到過這樣的事情嗎?
編輯: IE 不會觸發這兩個標頭。這變得越來越奇怪了。
解決方案!:正如 @adaptr 指出的那樣,這是 PHP 的問題,而不是任何與伺服器相關的事情。最後一個編碼員(我知道責怪前輩是不禮貌的,但是這種情況花了我太多時間)這樣做了:
/* config.php -> included everywhere as a bootstrap*/
// ... constant/mysql setup
if($notLogged)
{
$forward = ...;//previous url
header("Location: ".WWW.LANG."/customer-area/login/index.php?forward=".$forward);
exit;
}
深入研究後,有些事情讓我困惑:exit;
會正確發送標頭,還是不會?當然,刪除它exit;
會繼續執行頁面(我知道它根本不正確,這就是我之前沒有嘗試過的原因)。但是,如果標頭沒有完全發送,則可能會導致任何類型的問題(我不是伺服器人員,我不確定這一點,對不起,夥計們)。刪除該exit;
呼叫後,頁面已正確形成,標題「關閉」(因為輸出開始)並且所有齒輪再次開始移動。謝謝大家,最好獎勵100分 =)
答案1
如果 apache 日誌沒有顯示任何錯誤,則表示 PHP 處理了所有這些 - 並且也向用戶端傳回了奇怪的回應。
啟用正確的 PHP 日誌記錄並調查它正在做什麼。
響應中的這一位具有指示性:
傳輸編碼:分塊
這意味著 PHP 在(文字/html)流中發送回應沒有定義內容大小在標題中。
這可能會導致任何標頭輸出(PHP 經常緩存的東西,即它是無序生成的)哪怕只是一點點,都會導致客戶端認為正在發送一個新頁面。
這只是一個可能的原因;正確的 PHP 日誌記錄會告訴您更多。
答案2
你需要調試頁面代碼而不是查看伺服器查找原因。從您發布的內容中我可以看出,它是使用 FrontPage 創建的(真的,專業人士使用過它嗎?),因此它不可避免地包含在非 Microsoft 平台上無法正常工作的程式碼。透過刪除所有 Microsoft 特定程式碼來修復程式碼,它可能會正確運作。