Problema con gli header della risposta HTTP in PHP

Secondo le regole HTTP, prima vengono inviati gli header HTTP, e poi il corpo della risposta HTTP. Per questo motivo, lavorare con la funzione header in PHP ha le sue particolarità.

Il fatto è che se prima della chiamata a questa funzione c'è qualche output a schermo, esso verrà interpretato come l'inizio del corpo della risposta. In questo caso, la chiamata alla funzione header porterà a un avviso di PHP con il testo headers already sent. In questo caso, gli header potrebbero anche essere inviati. Potrebbe anche non essere visualizzato alcun errore (dipende dalle impostazioni di PHP). Ma molto spesso ciò accade solo in ambiente di sviluppo locale, mentre quando il sito viene pubblicato su Internet tutto si romperà.

Per output a schermo si intende qualsiasi testo. Ad esempio, così:

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

O una riga vuota:

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

O uno spazio:

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

O un tag:

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

O l'output tramite echo:

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

O l'output tramite var_dump:

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

Anche gli avvisi di PHP saranno output a schermo. Nel seguente esempio viene intenzionalmente effettuato un accesso a una variabile inesistente, il che porterà all'output di un avviso:

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

Anche l'alternarsi dei tag PHP genera output a schermo:

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

Create intenzionalmente un output a schermo prima della funzione header. Studiate il testo dell'errore che si verifica.

Задание 2

Correggete l'errore commesso in questo codice:

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