Formation PUB010 : PHP, 2022 La redirection PHP

24.1 Rediriger vers une autre page Web avec header()


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.

PHP

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

Ne rien envoyer au navigateur avant l'appel à header()

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...

Texte écrit en dehors des balises <?php et ?> 

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.

PHP

<!DOCTYPE html>

<?php header("Location: index.php"); ?>

echo

À 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.

PHP

echo "Opération réussie !";

<?php header("Location: index.php"); ?>

Require d'un fichier qui fait un echo

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.

PHP

require 'include/entete.inc';

<?php header("Location: index.php"); ?>

Espaces ou lignes blanches en dehors des balises <?php et ?>

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

   ...

?>

       

<?php

   ...

?>

<?php header("Location: index.php"); ?>

Encore plus subtile, des espaces avant une section <?php ... ?> peuvent empêcher un header() de fonctionner.

PHP

       <?php

            ...

        ?>

        <?php header("Location: index.php"); ?>

Et que dire de ce cas, encore plus difficile à détecter que le précédent...

PHP

<?php ... ?>       

<?php header("Location: index.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 :

  • Allez dans le menu File / Settings... (Windows) ou PhpStorm / Preferences (Mac).
  • Choisissez Editor / General / Appearance.
  • Cochez Show whitespaces.

Ceci vous aidera à voir rapidement les espaces indésirables.

Espaces représentés par des points dans PhpStorm

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.

Ligne blanche après ?>

Si la page se termine par du code PHP, il n'est pas nécessaire de refermer le bloc avec ?>.

PHP

<?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.

Fichier configuration.inc (PHP)

<?php
   ...
?>
 

PHP

require 'include/configuration.inc';
...
<?php header("Location: index.php"); ?>

Commentaire HTML

Contrairement aux commentaires PHP, les commentaires HTML sont envoyés au navigateur.

Ce code empêchera donc une redirection de fonctionner. 

PHP

<!-- un commentaire -->

<?php header("Location: index.php"); ?> 

Encodage du fichier avec BOM

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.

Page qui se termine par du PHP

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

<?php
   ...
?>

Mémoire tampon autorisée dans le fichier php.ini

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) ».

Pour plus d'information

« 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/

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Par Christiane Lagacé
Dernière révision le 29 février 2024
Merci de partager !

Site fièrement hébergé chez A2 Hosting.

Soumettre