當前位置: 首頁> 最新文章列表> 忽略BOM 頭導致header() 失效的隱藏問題

忽略BOM 頭導致header() 失效的隱藏問題

M66 2025-05-28

在PHP 編程中,我們經常會遇到header()函數不起作用的情況。 header()函數通常用於在腳本輸出之前發送原始HTTP 頭,例如設置頁面的內容類型或重定向用戶。然而,很多開發者在使用header()時可能會遇到突然失效的情況,造成了困惑。那麼,為什麼header()函數突然失效呢?很有可能是因為你忽略了(字節順序標記)這一隱藏問題。

什麼是BOM 頭?

BOM(Byte Order Mark)是Unicode 編碼的一種特殊標記,用於指示文本文件的字節順序。通常它在文件開頭包含一些不可見的字符。儘管BOM 頭對普通文本文件的讀取沒有影響,但它卻對PHP 的header()函數產生了很大的影響。

在PHP 中, header()函數必須在任何輸出之前調用。換句話說,不能在調用header()後有任何輸出(包括HTML 標籤、空格、換行等)。而BOM 頭實際上是文件開頭的一部分,它在文件的最前面加入了不可見的字節。如果你的PHP 文件是UTF-8 編碼並且含有BOM 頭,那麼這些隱形字符會在PHP 輸出之前先被發送到瀏覽器,這就導致了header()函數無法正常工作,因為HTTP 響應頭已經被部分發送了。

如何檢查和移除BOM 頭?

  1. 檢查BOM 頭<br> 可以使用文本編輯器(例如Notepad++ 或Sublime Text)打開你的PHP 文件,查看文件是否存在BOM 頭如果文件是UTF-8 編碼並且含有BOM 頭,文本編輯器通常會有相關的標識。

  2. 移除BOM 頭<br> 如果你發現文件包含BOM 頭,可以通過以下方式去除它

    • Notepad++中,打開文件後點擊編碼菜單,選擇無BOM 的UTF-8

    • Sublime Text中,使用Save with Encoding選項保存為UTF-8格式(無BOM)。

  3. PHP 中的處理方法<br> 如果你無法直接修改文件的編碼或編輯工具不支持,你還可以在PHP 中使用以下代碼來清除BOM 頭

    <?php
    // 在文件頂部添加此代碼
    if (substr(utf8_decode(file_get_contents('yourfile.php')), 0, 3) == "\xEF\xBB\xBF") {
        file_put_contents('yourfile.php', substr(file_get_contents('yourfile.php'), 3));
    }
    ?>
    

    這樣可以檢查文件是否存在BOM 頭,並在文件加載時去除它。

常見的錯誤示例

  1. 錯誤的PHP 代碼:

     <?php
    // BOM 頭導致 header() 無效
    header("Location: https://m66.net");
    exit;
    ?>
    

    如果這個PHP 文件包含BOM 頭, header()函數將無法正常工作,瀏覽器會收到一個已經開始的響應,導致無法重定向。

  2. 解決方案:
    刪除BOM 頭,或者確保header()函數在任何輸出之前調用:

     <?php
    // 刪除 BOM 頭之後
    header("Location: https://m66.net");
    exit;
    ?>
    

總結

在開發PHP 程序時, header()函數失效的常見原因之一就是文件中包含了BOM 頭。雖然BOM 頭通常不容易被發現,但它確實會對header()函數造成乾擾。為了避免這種情況,開發者可以確保保存的PHP 文件不包含BOM 頭,並在文件編碼時注意選擇無BOM 的UTF-8 編碼格式。

如果你遇到類似問題,檢查文件編碼並確保沒有BOM 頭,是解決問題的有效途徑。