Vấn đề với tiêu đề phản hồi HTTP trong PHP
Theo quy tắc HTTP, trước tiên các
tiêu đề HTTP được gửi đi, sau đó mới đến phần thân của phản hồi HTTP.
Do đó, việc làm việc với hàm header
trong PHP có những đặc điểm riêng.
Vấn đề là nếu có bất kỳ đầu ra nào trên màn hình
trước khi gọi hàm này,
nó sẽ được hiểu là phần bắt đầu
của phần thân phản hồi. Trong trường hợp này, lời gọi
hàm header sẽ dẫn đến
cảnh báo từ PHP với nội dung
headers already sent.
Ngay cả khi đó, các tiêu đề vẫn có thể được gửi đi.
Thậm chí lỗi có thể không hiển thị (tùy thuộc vào
cài đặt PHP). Nhưng thông thường điều này chỉ xảy ra
trên máy local, còn khi triển khai trang web lên internet
mọi thứ sẽ bị hỏng.
Đầu ra trên màn hình được hiểu là bất kỳ văn bản nào. Ví dụ:
text
<?php
header('Content-Type: text/html');
?>
Hoặc một dòng trống:
<?php
header('Content-Type: text/html');
?>
Hoặc một dấu cách:
<?php
header('Content-Type: text/html');
?>
Hoặc một thẻ:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Hoặc đầu ra qua echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Hoặc đầu ra qua var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Ngay cả các cảnh báo từ PHP cũng được coi là đầu ra trên màn hình. Trong ví dụ tiếp theo, cố tình truy cập vào một biến không tồn tại, sẽ dẫn đến việc đưa ra cảnh báo:
<?php
$text += 1;
header('Content-Type: text/html');
?>
Việc ngắt các cặp ngoặc PHP cũng tạo ra đầu ra trên màn hình:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Cố tình tạo đầu ra trên màn hình
trước hàm header.
Nghiên cứu nội dung của lỗi phát sinh.
Sửa lỗi mắc phải trong mã này:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>