Il arrive qu'un programme Web ait besoin de rediriger automatiquement l'internaute vers une nouvelle page Web. Ce sera le cas par exemple pour une page Web qui doit enregistrer des données puis retourner à la page qui affiche un tableau de l'ensemble des données enregistrées.
En PHP, c'est la fonction header() qui se charge de cette tâche.
header("Location: index.php");
Notez qu'il ne doit pas y avoir d'espace entre Location et les deux points.
▼Publicité Le texte se poursuit plus bas
Pour que la fonction header() puisse transférer le traitement vers une nouvelle page Web, l'instruction doit être placée AVANT toute balise HTML.
Autrement dit, rien ne doit avoir été envoyé au navigateur avant le header().
Si du texte ou des balises HTML ont déjà été envoyés au navigateur lorsque le header() est exécuté, ceci générera l'erreur « Warning: Cannot modify header information - headers already sent ».
Le message complet vous donnera des indications sur la ligne de code qui a envoyé du texte au navigateur. Par exemple, si le message indique : « (output started at C:\...\monfichier.php:120) », c'est que la ligne 120 du fichier monfichier.php a envoyé du texte au navigateur.
Notez que selon les configurations du serveur, il pourrait y avoir une zone tampon qui permet une redirection même si quelques caractères ont été envoyés au navigateur. Mais comme ceci dépend des configurations serveur, il est préférable de coder l'application comme si cette zone n'existait pas.
Voici quelques exemples de texte qui a été envoyé au navigateur. Si certains cas sont évidents à détecter, d'autres demandent un peu plus de flair...
Tout ce qui est écrit en dehors des les balises <?php et ?>, que ce soit une balise HTML ou du texte, sera envoyé directement au navigateur. Il n'est donc pas possible d'effectuer un appel à header() après.
<!DOCTYPE html>
À chaque fois que le code PHP effectue un echo, le texte correspondant est envoyé au navigateur. Il n'est donc pas possible d'effectuer un header() après un echo.
echo "Opération réussie !";
Si votre code contient un require d'un fichier qui contient un echo, ce echo enverra du code au navigateur donc empêchera la redirection.
require 'include/entete.inc';
Parfois, certains codes auront été envoyés au navigateur sans que nous nous en rendions compte. C'est le cas, notamment, s'il y a des lignes blanches entre deux sections <?php ... ?>.
<?php
...
?>
<?php
...
?>
Encore plus subtile, des espaces avant une section <?php ... ?> peuvent empêcher un header() de fonctionner.
<?php
...
?>
Et que dire de ce cas, encore plus difficile à détecter que le précédent...
<?php ... ?>
Pour vous aider à repérer les espaces indésirables, il est possible de configurer PhpStorm afin qu'il affiche un petit point à chaque espace et une flèche à chaque caractère de tabulations :
Ceci vous aidera à voir rapidement les espaces indésirables.
Notez que PhpStorm effacera automatiquement les espaces situés à droite d'un ?>. Cependant, ça pourrait ne pas être le cas dans d'autres situations ou avec un autre éditeur. Il est donc conseillé de toujours configurer votre éditeur pour qu'il rende les espaces et les tabulations visibles.
Si la page se termine par du code PHP, il n'est pas nécessaire de refermer le bloc avec ?>.
<?php
...
C'est même préférable de ne pas le faire puisque si jamais il y avait un saut de ligne après ?>, la ligne blanche qui suit serait envoyée au navigateur.
Ce fichier ne pourrait pas être requis par un autre qui doit faire une redirection.
<?php
...
?>
require 'include/configuration.inc';
...
Contrairement aux commentaires PHP, les commentaires HTML sont envoyés au navigateur.
Ce code empêchera donc une redirection de fonctionner.
<!-- un commentaire -->
L'encodage de vos fichiers PHP doit être au format UTF-8 sans BOM. En effet, les BOM (Byte Order Mark) sont des caractères invisibles que PHP ne sait pas interpréter. Il les envoie donc directement au navigateur, ce qui peut causer des problèmes.
Assurez-vous donc que l'encodage de votre fichier n'utilise pas les BOM.
Si la toute dernière instruction d'un fichier PHP est ?>, vous pouvez omettre cette instruction.
Ceci évitera les risques qu'il y ait des espaces sur la ligne après ?> ou une ligne blanche après cette instruction.
L'instruction ?> n'est requise que s'il y a des balises HTML à envoyer au navigateur après avoir terminé les instructions PHP.
<?php
...
Il est possible que les configurations sur le serveur autorisent une mémoire tampon avant d'envoyer des informations au navigateur. D'autres serveurs pourraient ne pas en autoriser.
Pour vous assurer que votre code fonctionne peu importe les configurations, consultez les détails sur la fiche « slug_de_la_fiche (fiche inexistante) ».
« header ». PHP. http://php.net/manual/fr/function.header.php
« PHP - How to fix the error "Warning: Cannot modify header information – headers already sent by …" ». MoGosselin. http://www.mogosselin.com/warning-cannot-modify-header-information-headers-already-sent-by/
Site fièrement hébergé chez A2 Hosting.