- 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 …
TÓM TẮT NỘI DUNG
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 |
<?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.