Hướng dẫn fix lỗi “Cannot modify header information – headers already sent”

  • 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 

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

Rate this post
Next Post

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

You might also like