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.
Les instructions de redirection se trouvent dans l'en-tête HTTP envoyée au navigateur. Le principe est le suivant :
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();
?>
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 :
A partir du formulaire suivant :
é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.