Hướng dẫn khắc phục lỗi Warning: Cannot modify header information hiệu quả

Những điểm chính

 

Khái niệm: Hiểu rõ bản chất lỗi “Cannot modify header information”, giúp bạn nhanh chóng xác định nguyên nhân đến từ việc output dữ liệu trước khi xử lý header HTTP.

 

Nguyên nhân gây lỗi: Nắm được các nguyên nhân phổ biến như khoảng trắng thừa, lệnh echo, file UTF-8 BOM hoặc file include sinh output ngoài ý muốn.

 

Cách khắc phục: Biết cách kiểm tra mã nguồn, loại bỏ ký tự thừa, chỉnh encoding và sử dụng output buffering để xử lý lỗi hiệu quả.

 

Lưu ý quan trọng: Hiểu các nguyên tắc cần tuân thủ khi xử lý header trong PHP để tránh lỗi phát sinh lại trong tương lai.

 

Lỗi Warning: Cannot modify header information là gì?

 

Lỗi Warning: Cannot modify header information – headers already sent by xuất hiện khi PHP cố gắng gửi HTTP header sau khi dữ liệu đã được xuất ra trình duyệt trước đó. Trong PHP, các hàm như:

 

  • header()

 

  • setcookie()

 

  • session_start()

 

đều cần được thực thi trước khi có bất kỳ output nào được gửi tới trình duyệt.

 

Nếu trước các hàm này đã tồn tại dữ liệu đầu ra như:

 

  • khoảng trắng,

 

  • ký tự xuống dòng,

 

  • HTML,

 

  • lệnh echo,

 

  • print,

 

  • var_dump(),

 

thì PHP sẽ không thể sửa đổi header nữa và sinh ra cảnh báo.

 

Warning: Cannot modify header information,  headers already sent by

 

Thông báo lỗi thường có dạng:


 
Warning: Cannot modify header information 

- headers already sent by

(output started at /path/file.php:10)

in /path/another.php on line 25
 

Trong đó:

 

  • output started at cho biết file và dòng bắt đầu sinh output.

 

  • on line là vị trí PHP cố gắng gửi header nhưng thất bại.

 

Nguyên nhân gây ra lỗi Warning: Cannot modify header information

 

Nguyên nhân cốt lõi là dữ liệu output đã được gửi ra trước khi PHP xử lý header HTTP.

 

Khoảng trắng hoặc ký tự thừa trong file PHP

 

Các khoảng trắng hoặc ký tự nằm:

 

  • trước <?php

 

  • sau ?>

 

đều được xem là output.

 

Ví dụ lỗi:


 
 <?php

header("Location: index.php");
 

Hoặc:


 
<?php

header("Location: index.php");

?>
 

Khoảng trắng ở cuối file cũng có thể gây lỗi.

 

Sử dụng echo hoặc print trước header

 

Nếu bạn xuất dữ liệu ra màn hình trước khi gọi header() hoặc session_start() thì lỗi sẽ xuất hiện.

 

Ví dụ:


 
echo "Hello";


header("Location: index.php");
 

PHP đã gửi dữ liệu "Hello" tới trình duyệt nên không thể chỉnh sửa header nữa.

 

File include hoặc require sinh output

 

Nhiều trường hợp lỗi đến từ file được include.

 

Ví dụ:


 
include 'config.php';

header("Location: home.php");
 

Nếu config.php chứa:

 

  • khoảng trắng,

 

  • HTML,

 

  • ký tự BOM,

 

  • lệnh echo,

 

thì vẫn phát sinh lỗi dù file chính không có output.

 

File lưu dưới định dạng UTF-8 BOM

 

Một số editor lưu file với định dạng UTF-8 with BOM.

 

Ký tự BOM là ký tự ẩn được gửi ra trình duyệt ngay khi file được đọc, khiến PHP hiểu rằng output đã bắt đầu.

 

Đây là nguyên nhân rất phổ biến trong WordPress hoặc PHP thuần.

 

Cách khắc phục lỗi Warning: Cannot modify header information

 

Xóa khoảng trắng thừa trong file PHP

 

Bạn cần mở file được báo lỗi và:

 

  • xóa khoảng trắng trước <?php

 

  • xóa ký tự sau ?>

 

Nếu file chỉ chứa PHP, tốt nhất nên bỏ luôn thẻ đóng ?>.

 

Ví dụ chuẩn:


 
<?php


header("Location: index.php");
 

Kiểm tra các lệnh xuất dữ liệu

 

Rà soát các lệnh như:

 

  • echo

 

  • print

 

  • print_r

 

  • var_dump

 

  • HTML trực tiếp

 

được đặt trước:

 

  • header()

 

  • session_start()

 

  • setcookie()

 

Nếu có, hãy:

 

  • di chuyển xuống dưới,

 

  • hoặc tạm thời xóa bỏ khi debug.

 

Lưu file dưới dạng UTF-8 without BOM

 

Bạn mở file bằng:

 

  • VS Code

 

  • Sublime Text

 

  • Notepad++

 

sau đó chọn:

 

  • UTF-8

 

  • hoặc UTF-8 without BOM

 

rồi lưu lại file.

 

Điều này giúp loại bỏ ký tự BOM ẩn gây output.

 

Kiểm tra các file include/require

 

Bạn cần kiểm tra toàn bộ file được include hoặc require trong stack lỗi.

 

Đặc biệt là các file:

 

  • config.php

 

  • functions.php

 

  • header.php

 

  • plugin WordPress

 

  • file template

 

để đảm bảo chúng không sinh output ngoài ý muốn.

 

Sử dụng Output Buffering

 

Nếu chưa tìm được vị trí gây output, bạn có thể sử dụng output buffering.

 

Ví dụ:


 
<?php

ob_start();

// Code PHP

ob_end_flush();
 

ob_start() sẽ tạm lưu output vào buffer thay vì gửi trực tiếp ra trình duyệt.

 

Sau khi header xử lý xong, dữ liệu mới được xuất ra.

 

Tuy nhiên, đây chỉ nên xem là giải pháp hỗ trợ chứ không nên lạm dụng.

 

Bật output_buffering trong php.ini

 

Nếu có quyền quản trị server, bạn có thể bật output buffering toàn cục.

 

Mở file php.ini:


 
output_buffering = Off
 

Đổi thành:


 
output_buffering = On
 

Sau đó restart:

 

  • Apache

 

  • Nginx + PHP-FPM

 

  • hoặc dịch vụ web server tương ứng.

 

Một số lưu ý khi sửa lỗi Cannot modify header information

 

Sao lưu mã nguồn trước khi chỉnh sửa

 

Trước khi sửa:

 

  • file PHP,

 

  • encoding,

 

  • cấu hình server,

 

bạn nên backup để tránh phát sinh lỗi ngoài ý muốn.

 

Ưu tiên sửa nguyên nhân gốc

 

Không nên quá phụ thuộc vào ob_start().

 

Giải pháp tốt nhất vẫn là:

 

  • loại bỏ output không cần thiết,

 

  • tối ưu cấu trúc mã nguồn,

 

  • kiểm soát thứ tự xử lý header.

 

Kiểm tra đúng file và dòng lỗi

 

Thông báo lỗi luôn chỉ rõ:

 

  • file bắt đầu output,

 

  • số dòng liên quan.

 

Bạn nên kiểm tra đúng vị trí đó thay vì sửa lan man toàn dự án.

 

Kiểm tra lại toàn bộ chức năng sau khi sửa

 

Sau khi xử lý lỗi, hãy kiểm tra lại:

 

  • đăng nhập,

 

  • redirect,

 

  • cookie,

 

  • session,

 

  • giỏ hàng,

 

  • API response,

 

để đảm bảo header hoạt động bình thường và website không còn cảnh báo.

 HỖ TRỢ TRỰC TUYẾN