La redirection de page est souvent utilisée dans le développement pour résoudre des cas spécifiques de traitement. Rédiriger une page consiste à ne pas renvoyer au client la page qu'il a demandé initialement.

Un exemple typique est un traitement de login. Le formulaire est gèré/affiché par le script/page login.php et envoyé au script/page accueil.php. Si le login n'est pas correct on ne doit pas envoyer accueil.php, mais renvoyer à nouveau login.php. On va donc faire une redirection vers login.php.

redirection

Les instructions de redirection se trouvent dans l'en-tête HTTP envoyée au navigateur. Le principe est le suivant :

- le navigateur demande une page,
- le serveur (PHP) envoie un en-tête HTTP de redirection,
- le navigateur demande la nouvelle page,
- le serveur envoie cette page.

PHP fournit la fonction header() pour générer des en-têtes HTTP et les envoyer au client. L'en-tête qui gére les redirections s'appelle Location et a comme valeur l'URL de la page sur laquelle on redirige le navigateur, par exemple :
Location: test_divers/accueil.html
va rediriger le navigateur sur la page accueil.html du répertoire test_divers.

Dans l'exemple suivant, si le mot de passe est "piat", l'utilisateur a bien accès à la page d'accueil. Sinon il est redirigé vers la page de login.

Code de la page login.php

    <?php
    require('bib_fonctions.php');

    htmlDebut('Login');

    if (isset($_GET['err'])) {
    	echo '<h4>Login incorrect</h4>';
    }

    echo '<form method="post" action="accueil.php">',
    	'<label>Login</label>',
    	'<input type="text" name="txtLogin">',
    	'<label>Mot de passe</label>',
    	'<input type="password" name="txtPasse">',
    	'<input type="submit" name="btnSub" value="Ok">',
    	'</form>';

    htmlFin();
    ?>

Code de la page accueil.php

    <?php
    require('bib_fonctions.php');

    htmlDebut('Accueil');

    if ($_POST['txtPasse'] != 'piat') {
    	header('Location: login.php?err=1');
    	exit();
    }

    htmlInfo('Page d\'accueil');

    htmlFin();
    ?>

Tester l'exemple

Le code de la page accueil.php est bien sûr limité pour ne pas complexifier l'exemple. Ce qui est important c'est la redirection :

    if ($_POST['txtPasse'] != 'piat') {
    	header('Location: login.php?err=1');
    	exit();
    }
    ?>

Notez que l'appel de la fonction header() dans le cas spécifique d'une redirection DOIT être suivi immédiatement de la sortie du script avec exit. Si ce n'est pas le cas, le reste du script s'exécutera normalement, avec par exemple toutes les mises à jour éventuelles de base de données.

Il est particulièrement important de comprendre que header('Location: login.php?err=1'); n'arrête pas le script, mais envoie "simplement" un en-tête HTTP.

Suivant la façon dont est configuré PHP, le script précédent peut ne pas s'exécuter correctement et provoquer l'erreur Cannot modify header information - headers already sent.

L'affichage de ce message d'erreur vient de la façon dont sont construits les messages HTTP : les en-têtes doivent se trouver au début du message et pas dans le corps du message, constitué des sorties d'affichage (ie echo ou print) que fait le script.

Pour éviter ce problème, il y a 3 solutions :

- configurer PHP avec l'option output_buffering à ON. Souvent impossible car on n'a pas accès à la configuration du serveur.
- avoir une grande rigueur et toujours envoyer les en-têtes avant quelque autre sortie que ce soit. Trop hasardeux : le développeur n'est pas toujours strict, le développement ne peut pas toujours être adapté.
- utiliser les fonctions de buffering comme nous allons le voir dans les pages suiavantes.

### Exercice : rediriger une page

A partir du formulaire suivant :

Login

écrivez le script qui permet de rediriger l'utilisateur vers la page accesA.html si le login saisi commence par a ou vers la page accesB.html si le login saisi commence par b. Dans tous les autres cas, affichez un message d'erreur et représenter le formulaire.

Une solution possible

Exercice : rediriger une page
<?php require('bib_fonctions.php'); $erreur = ''; //--- Si soumission test redirection ---------------- if (isset($_POST['btnOk'])) { $debut = substr($_POST['txtLogin'], 0, 1); if ($debut == 'a') { header('Location: accesA.html'); exit(); } elseif ($debut == 'b') { header('Location: accesB.html'); exit(); } else { $erreur = 'Mauvais login'; } } //--- Affichage page HTML --------------------------- htmlDebut('Redirection'); if ($erreur != '') { htmlInfo($erreur); } echo '<form method="post" action="', $_SERVER['PHP_SELF'], '">', 'Login <input type="text" name="txtLogin">', '<input type="submit" name="btnOk" value="OK">', '</form>'; htmlFin(); ?>