Thứ Sáu, 8 tháng 5, 2026

Cannot modify header information – lỗi nhìn đáng sợ nhưng nguyên nhân thường rất “nhảm”

Đăng nhập là một từ mà chúng ta bắt buộc phải "quen thuộc" dù muốn hay không: Facebook, Instagram, Shopee, Grab...Và tạo trang đăng nhập cũng là một việc "thường ngày ở huyện". Tuy nhiên, đôi khi trong những cái "bình thường" lại nảy sinh những cái "bất thường".


Bạn viết code cho trang login.


Sau khi login thành công, bạn redirect user sang trang chủ (1000% bình thường mà?!):


header("Location: home.php");


Mọi thứ tưởng như hoàn hảo…


👉 Nhưng PHP đáp lại bằng một câu dài ngoằng:


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


Bạn đọc xong…


👉 không hiểu gì hết 🤡


"Cannot modify gì cơ???"

"Header nào???"

"Sent hồi nào???"


👉 Bình tĩnh 😅


Lỗi này nghe "ghê gớm" vậy thôi, nhưng thật ra:


nguyên nhân thường rất nhỏ.



Lỗi "Cannot modify header information – headers already sent" trong PHP xảy ra khi:


  • bạn đã output dữ liệu trước khi gọi header()
  • hoặc có khoảng trắng / HTML / echo trước PHP


Hiểu cực kỳ đơn giản


👉 PHP có một quy tắc:


Header phải gửi trước nội dung


👉 Nhưng code của bạn lại:


gửi nội dung trước

rồi mới redirect


👉 PHP:


"Không sửa header được nữa 😅"


Ví dụ đời thường


👉 Bạn gửi hàng qua bưu điện.


Bình thường sẽ là:


  • ghi địa chỉ người nhận
  • gửi hàng


👉 Nhưng bạn lại:


  • gửi hàng trước
  • rồi mới ghi địa chỉ 🤡


👉 Bưu điện:


"Ủa rồi gửi đi đâu trời???"


👉 PHP cũng đang "khóc thầm" như vậy 😅


Case kinh điển số 1: echo trước header

<?php

echo "Đăng nhập thành công";


header("Location: home.php");

?>


👉 echo đã gửi output ra trình duyệt


→ header fail


👉 Đây là lỗi:


"vui miệng quá sớm" 😅


Fix đúng

<?php

header("Location: home.php");

exit;

?>


👉 Redirect trước

👉 rồi hãy làm chuyện khác 😏


Case kinh điển số 2: khoảng trắng "vô hình"


👉 File của bạn:


   <?php

header("Location: home.php");


👉 Mấy dấu space kia:


  • nhìn vô hại
  • nhưng vẫn là output 🤡


👉 PHP:


"Bạn đã gửi dữ liệu rồi nhé 😅"


Case kinh điển số 3: HTML trước PHP

<h1>Hello</h1>


<?php

header("Location: home.php");

?>


👉 HTML = output


→ header không chạy được


Case kinh điển số 4: include file "phản chủ"


👉 File chính:


include "config.php";


header("Location: home.php");


👉 Nhưng trong config.php có:


echo "Test";


👉 Boom 💥


👉 Đây là kiểu lỗi:


"thủ phạm nằm ở file khác" 😅


Cách debug nhanh (rất hữu ích)


👉 Đọc kỹ lỗi:


output started at...


👉 PHP thường sẽ chỉ luôn:


  • file nào
  • dòng nào


👉 Đừng hoảng vì câu lỗi dài 😅


👉 Nó đang giúp bạn đó.


Checklist "cứ theo là ra"


👉 Khi gặp lỗi này:


  1. Có echo trước header() không?
  2. Có HTML trước PHP không?
  3. Có khoảng trắng trước <?php không?
  4. File include có output không?
  5. Có dùng UTF-8 BOM không? (ít gặp hơn)


👉 90% lỗi nằm ở 1–4 😏


Cách viết "an toàn"


👉 Thường nên:


<?php


// xử lý login


if ($login_success) {

    header("Location: home.php");

    exit;

}

?>


👉 Không echo trước đó


Một sự thật hơi "đau"


👉 Lỗi này:


  • nhìn đáng sợ
  • nhưng nguyên nhân đôi khi chỉ là…
  • một dấu cách 😅


👉 Và bạn có thể debug:


2 tiếng

chỉ vì… space 🤡


Tổng kết


"Cannot modify header information" không phải lỗi "cao siêu"


👉 Nó chỉ là:


bạn đã gửi output quá sớm


👉 Nhớ:


  • header trước
  • output sau
  • tránh echo linh tinh 😏


FAQ nhanh


Vì sao mình không echo mà vẫn lỗi?

→ có thể do HTML, khoảng trắng hoặc file include


Dùng ob_start có fix được không?

→ Có, nhưng người mới chưa cần vội


Lỗi này có nguy hiểm không?

→ Không nguy hiểm, nhưng rất khó chịu 😅


👉 Bạn có thể cũng đang gặp:

Header already sent

PHP không nhận dữ liệu từ form

Session không hoạt động


(👉 đều liên quan đến flow request/response của PHP)

Không có nhận xét nào:

Đăng nhận xét