首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP header() 跳轉常見錯誤與最佳實務總結

     編輯:PHP 綜合知識

前言

header("Location: ...") 是 PHP 執行頁面重導向的標準方式,但新手常因輸出順序、空格、編碼、執行流程控制等問題導致失效。本文整理四大核心注意事項、與 ASP 對比、常見錯誤場景及解決方案。

一、四大鐵律

  1. Location 後不可有空格:header("Location: url") ✓ / header("Location : url") ✗
  2. header() 前不可有任何輸出:包含 HTML 空白、BOM、echo、print_r、var_dump、錯誤訊息、甚至 <?php 前的換行。
  3. header() 後的程式碼仍會繼續執行:瀏覽器收到重導向標頭會跳轉,但 PHP 腳本不會自動停止,必須自行 exit() 或 die()。
  4. UTF-8 檔案儲存時需關閉 BOM:BOM 會被視為輸出導致「headers already sent」,請使用「UTF-8 無 BOM」編碼儲存。

二、與 ASP Response.Redirect 對比

特性ASP Response.RedirectPHP header()
可在輸出 HTML 後呼叫是(緩衝區預設開啟)否(除非開啟 output_buffering)
執行後腳本是否繼續否(隱含終止)是(需自行 exit)
多次重導向行為第一次生效最後一次生效

程式碼對比



<% Response.Redirect "../test.asp" %>




...

三、常見錯誤場景與修正

1. 「Cannot modify header information - headers already sent」

  • 檢查是否有 echo、print、HTML 空白在 header() 之前。
  • 檢查檔案開頭是否有 BOM(用編輯器另存為 UTF-8 無 BOM)。
  • 開啟 output_buffering = On(php.ini)或腳本開頭 ob_start()。

2. 跳轉不生效、頁面停留原地

  • 忘記 exit(),後續程式碼輸出內容干擾瀏覽器跳轉。
  • Location 值為相對路徑,建議使用絕對 URL:header("Location: https://{$_SERVER['HTTP_HOST']}/target.php")。
  • HTTP 狀態碼預設 302,若需永久導向請加 header("Location: ...", true, 301)。

3. 中文參數導向亂碼

$url = "search.php?kw=" . urlencode("關鍵字");
header("Location: $url");

四、最佳實務模板



...錯誤提示...

五、進階技巧

  • 延遲跳轉:header("Refresh: 3; url=target.php"); 3 秒後跳轉,配合顯示「3 秒後自動跳轉」訊息。
  • AJAX 請求中跳轉:無法直接用 header 導向,需回傳 JSON {"redirect": "url"},前端 JS 執行 location.href = data.redirect。
  • 攜帶 Session ID 跨域:確保 session_set_cookie_params() 設定正確 domain、path、secure、httponly。

六、總結檢查清單

  1. 檔案編碼為 UTF-8 無 BOM?
  2. header() 前是否有任何輸出(含空白、include 檔案的輸出)?
  3. Location: 後有無多餘空格?
  4. 是否使用絕對 URL?
  5. header() 後是否緊接 exit()?
  6. 是否設定正確 HTTP 狀態碼(301/302/303/307)?

遵循上述規範,即可避開 99% 的 header() 跳轉失敗問題,確保導向行為穩定可預期。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved