Problème avec les en-têtes de réponse HTTP en PHP
Selon les règles HTTP, les en-têtes HTTP sont d'abord envoyés,
puis le corps de la réponse HTTP.
Pour cette raison, l'utilisation de la fonction header
en PHP a ses particularités.
Le fait est que si une sortie est effectuée à l'écran
avant l'appel de cette fonction,
elle sera interprétée comme le début
du corps de la réponse. Dans ce cas, l'appel
de la fonction header entraînera
un avertissement PHP avec le texte
headers already sent.
Dans ce cas, les en-têtes pourraient même être envoyés.
L'erreur pourrait même ne pas s'afficher (cela dépend des
paramètres PHP). Mais le plus souvent, cela ne se produira
que en local, et lors du déploiement du site sur Internet,
tout va casser.
Par sortie à l'écran, on entend n'importe quel texte. Par exemple, comme ceci :
text
<?php
header('Content-Type: text/html');
?>
Ou une ligne vide :
<?php
header('Content-Type: text/html');
?>
Ou un espace :
<?php
header('Content-Type: text/html');
?>
Ou une balise :
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Ou une sortie via echo :
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Ou une sortie via var_dump :
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Même les avertissements PHP constituent des sorties à l'écran. Dans l'exemple suivant, on accède intentionnellement à une variable inexistante, ce qui entraînera l'affichage d'un avertissement :
<?php
$text += 1;
header('Content-Type: text/html');
?>
Les fermetures de balises PHP génèrent également une sortie à l'écran :
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Créez intentionnellement une sortie à l'écran
avant la fonction header.
Étudiez le texte de l'erreur qui se produit.
Corrigez l'erreur commise dans ce code :
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>