Faire une redirection vers une autre page

Rechercher

Faire une redirection vers une autre page

  • Par Emacs
  • 16 commentaires
  • 57818 lectures
  • RSS -  Atom

Il existe des applications web pour lesquelles on souhaite rediriger le visiteur en fonction de paramètres. C'est le cas par exemple pour un script d'identification. Si l'internaute fournit les bons identifiants alors il est redirigé automatiquement vers son espace personnel, sinon il est renvoyé vers le formulaire d'authentification.

Présentation des rédirections

Il y'a plusieurs manières de faire de la redirection HTTP par les pages Web : balises meta, script Javascript ou bien encore script PHP. Bien entendu, la dernière solution est de loin la meilleure et la plus propre car elle est entièrement gérée par le serveur, tandis que les deux autres sont réalisées du côté du client (donc potentiellement désactivables).

La fonction header()

Lorsque l'on souhaite créer une redirection avec PHP, on utilise une fonction permettant d'envoyer des entêtes de type Location (adresse). Pour cela, PHP dispose de la fonction header() qui se charge d'envoyer les entêtes passés en paramètre.

Règle importante : l'appel de cette fonction doit se faire avant tout envoi au navigateur (instruction echo, print, espace blanc, balise html...) sous peine de générer une erreur de type Headers already sent by.... Cette erreur signifie que la page a déjà été envoyée au navigateur avant de vouloir envoyer des entêtes HTTP. La logique de développement demande le contraire !

Script de redirection avec header()

La syntaxe de la redirection est simple. On passe en paramètre de la fonction header() une chaîne de caractères précisant le type d'entête (Location) et la page sur laquelle l'internaute doit être renvoyé.

Script de redirection
<?php
header('Location: http://www.votresite.com/pageprotegee.php');
exit();
?>

Note : l'instruction exit() qui succède la fonction header() permet de couper l'exécution du script car la redirection aura lieu immédiatement et le reste du code n'a pas d'intérêt à être interprêté.



Les commentaires

1. Par ^Reg[e]X$# le 18/12/2007 17:19

Joli tuto

2. Par Emacs le 18/12/2007 21:19

Merci

3. Par Jjenn le 01/01/2008 12:06

Excellent, Clair et Précis.
Merci !

4. Par donky le 08/01/2008 23:03

Comment faire une redirection après 3 secondes, exemple? Merci

5. Par Emacs le 09/01/2008 09:19

Avec Javascript ou une balise meta mais c'est fortement déconseillé de rediriger côté client. Il faut toujours rediriger côté serveur pour s'assurer que le changement de page a bien eu lieu.

6. Par donky le 09/01/2008 21:36

Donc pour rediriger côté serveur, il faut utiliser le Javascript, c'est ça?

7. Par Emacs le 10/01/2008 09:07

Non c'est l'inverse !!!

PHP = exécuté côté serveur
Javascript, HTML = exécuté côté client (navigateur)

Donc si tu veux rediriger après un laps de temps de X secondes, tu seras obligé de passer par une technologie cliente. Le problème, c'est que vu que c'est le navigateur du client qui exécute la redirection, il devient possible de la contourner (en désactivant Javascript par exemple). En revanche, en redirigeant côté serveur (cad avec PHP), tu t'assures que le client est bien redirigé.

8. Par Duffy le 16/06/2008 13:38

"Donc si tu veux rediriger après un laps de temps de X secondes, tu seras obligé de passer par une technologie cliente."

Non, tu n'es pas du tout obligé, pourquoi ne pas faire un sleep(X) juste avant le header, et voila le tours est joué

9. Par Emacs le 16/06/2008 16:24

@Duffy : hum wai à tester mais ça ne résoud pas le problème pour autant puisque de toute manière tu ne pourras pas afficher de contenu sur la sortie standard. En gros si tu fais :

<?php
echo 'Vous allez être redirigé dans 5 secondes';
sleep(5);
header('Location: http://www.monsite.com/page.php';
?>

Tu auras toujours une erreur t'indiquant que les entêtes ont déjà été envoyés au navigateur, donc la redirection tombera en échec.

10. Par Lise le 06/08/2008 00:06

Merci pour ce tuto, c'est clair et précis, parfait quoi

11. Par soussou le 28/11/2008 10:44

merci bien mais quand j'execute
if (condition){
header('location:index.php';
exit();
}
il y une message d'erreur:
Warning: Cannot modify header information - headers already sent by (output started at G:\EasyPHP 2.0b1\www\JOBAVIS\TMP12awdb1en5.php:212) in G:\EasyPHP 2.0b1\www\JOBAVIS\TMP12awdb1en5.php on line 355

12. Par Emacs le 28/11/2008 13:25

Normal il faut appeler cette fonction avant toute balise HTML et pas en plein milieu de ton HTML.

13. Par fillius le 29/05/2009 16:54

si je suis dans la page de traitement, c'est en fonction if() et else() que je redirige ma pages que dois je faire

14. Par Picamen le 12/08/2009 13:30

Attention en faisant ce type de redirection avec php, vous allez obtenir une redirection 302, qui peuvent être très mal gérée par les moteurs de recherche. Pour obtenir une redirection 301, ajoutez à votre header :
<?php
header("Status: 301 Moved Permanently", false, 301);
header("Location: http://www.votre-page-de-redirection.com";
exit();
?>

15. Par med le 19/08/2009 10:47

bonjour,
je voulai essayer cette fonction header, je l'est placer à la première ligne de ma page, mais malgré ca le message d'erreur me sort me disant que header est déja envoyée et que je ne peut pas faire de redirection, y a t'il une solution... svp

16. Par skeyscy le 04/10/2009 15:27

et maintenant, comment faire pour faire passer des parametres avec le header().Aidez ;oi svp