Проблем с заглавките на HTTP отговори в PHP

По правилата на HTTP първо се изпращат HTTP заглавки, а след това тялото на HTTP отговора. Поради това работата с функцията header в PHP има своите особености.

Работата е там, че ако преди извикването на тази функция има някакъв изход на екрана, той ще се тълкува като начало на тялото на отговора. В този случай извикването на функцията header ще доведе до предупреждение в PHP с текст headers already sent. В този случай заглавките може дори да бъдат изпратени. Може дори и грешката да не се изведе (зависи от настройките на PHP). Но най-често това ще се случва само на локалната машина, а при качване на сайта в интернет всичко ще се счупи.

Под изход на екрана се разбира какъвто и да е текст. Например, така:

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

Или празен ред:

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

Или интервал:

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

Или таг:

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

Или изход чрез echo:

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

Или изход чрез var_dump:

php<?php
  $str = 'abc';
  var_dump($str);
  
  header('Content-Type: text/html');
?>

Дори предупрежденията от PHP ще бъдат изходи на екрана. В следващия пример нарочно се осъществява достъп до несъществуваща променлива, което ще доведе до извеждане на предупреждение:

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

Празните редове между PHP скобите също генерират изход на екрана:

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

Създайте нарочно изход на екрана преди функцията header. Проучете текста на възникващата грешка.

Задание 2

Поправете грешката, допусната в този код:

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