Hướng dẫn fix lỗi "Cannot modify header information - headers already sent"

Hiện tượng lỗi

  • Hàm header() trong PHP không hoạt động
  • Trong trường hợp bạn cấu hình php.ini display_erros = On, PHP Parser sẽ hiển thị warning log: Cannot modify header information - headers already sent by (output started at ...) in ...php on line ...

Cannot modify header information - headers already sent | PHP

Nguyên nhân

Web server (Apache) không thể thay đổi thông số header của response, do trước đó bạn đã viết những câu lệnh Output (xuất thông tin/dữ liệu) về cho client.

Ví dụ:

header() không hoạt động header() hoạt động
<?php
     echo "Không thể tìm thấy trang, vui lòng thử một URL khác!";
    header("HTTP/1.0 404 Not Found"); //<-- KHÔNG HOẠT ĐỘNG (WARNING LOG)
<?php
     header("HTTP/1.0 404 Not Found"); //<-- HOẠT ĐỘNG BÌNH THƯỜNG
     echo
"Không thể tìm thấy trang, vui lòng thử một URL khác!";
<?php
  ...
  echo $pdf_file_data;
  header('Content-Type: application/pdf'); // <-- KHÔNG HOẠT ĐỘNG(WARNING LOG)
<?php
  ...
  header('Content-Type: application/pdf'); // <-- HOẠT ĐỘNG BÌNH THƯỜNG
  echo $pdf_file_data;

Nguyên lý

PHP chỉ có thể tác động đến thông số của header trong response trước khi xuất bất kỳ một thông tin/kết quả (output) nào cho client. Hay nói một cách khác, hàm header() chỉ có thể hoạt động khi nó được đặt trước các câu lệnh output (echo, print_r...)

Cách khắc phục (fix)

Bước 1. Tìm đến vị trí câu lệnh chứa hàm header() đang bị lỗi

Đầu tiên, bạn cần tìm đến vị trí câu lệnh chứa hàm header() đang bị lỗi. Bạn có thể dễ dàng tìm được vị trí này qua thông tin của dòng Warning log mà PHP parser đã cung cấp cho bạn. Ví dụ:

Warning: Cannot modify header information - headers already sent by (output started at /opt/lampp/htdocs/project-1/blog_detail.php:3) in /opt/lampp/htdocs/project-1/blog_detail.php on line 4

→ Vị trí lỗi nằm ở hàng thứ 4 của file blog_detail.php

Bước 2. Dời câu lệnh chứa hàm header() lên trên tất cả các câu lệnh xuất thông tin (câu lệnh Output)

Sau khi xác định được vị trí, bạn hãy dời câu lệnh chứa hàm header() lên trên tất cả các câu lệnh xuất thông tin (câu lệnh Output). Đây cũng chính là lý do vì sao các tài liệu về PHP luôn khuyến kích các coder ưu tiên sử dụng hàm header() ở vị trí đầu file PHP.

Bước 3. Lưu code và chạy lại để kiểm tra

Đăng ký để nhận được thông báo mỗi khi có bài viết mới!