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ì:
text
<?php
header('Content-Type: text/html');
?>
O una riga vuota:
<?php
header('Content-Type: text/html');
?>
O uno spazio:
<?php
header('Content-Type: text/html');
?>
O un tag:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
O l'output tramite echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
O l'output tramite var_dump:
<?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
$text += 1;
header('Content-Type: text/html');
?>
Anche l'alternarsi dei tag PHP genera output a schermo:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Create intenzionalmente un output a schermo
prima della funzione header.
Studiate il testo dell'errore che si verifica.
Correggete l'errore commesso in questo codice:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>