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ụ:

phptext
<?php
  header('Content-Type: text/html');
?>

Hoặc một dòng trống:

php     
<?php
  header('Content-Type: text/html');
?>

Hoặc một dấu cách:

php <?php
  header('Content-Type: text/html');
?>

Hoặc một thẻ:

html<div>
  <?php
    header('Content-Type: text/html');
  ?>
</div>

Hoặc đầu ra qua echo:

php<?php
  echo 'abc';
  header('Content-Type: text/html');
?>

Hoặc đầu ra qua var_dump:

php<?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<?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<?php
  echo 'abc';
?>
<?php
  header('Content-Type: text/html');
?>
Задание 1

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.

Задание 2

Sửa lỗi mắc phải trong mã này:

html<!DOCTYPE html>
<html>
  <head>
    <?php
      header('Content-Type: text/html');
    ?>
  </head>
  <body>
    text
  <body>
<html>