Faire une redirection vers une autre page - Apprendre-PHP.com

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

Faire une redirection vers une autre page

Faire une redirection vers une autre page

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 mardi 18 décembre 2007 à 17:05

Joli tuto

2. Par Emacs le mardi 18 décembre 2007 à 21:09

Merci Emoticone content

3. Par Jjenn le mardi 01 janvier 2008 à 12:12

Excellent, Clair et Précis.
Merci !

4. Par donky le mardi 08 janvier 2008 à 23:11

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

5. Par Emacs le mercredi 09 janvier 2008 à 09:09

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 mercredi 09 janvier 2008 à 21:09

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

7. Par Emacs le jeudi 10 janvier 2008 à 09:09

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 lundi 16 juin 2008 à 13:01

"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é Emoticone content

9. Par Emacs le lundi 16 juin 2008 à 16:04

@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 mercredi 06 août 2008 à 00:12

Merci pour ce tuto, c'est clair et précis, parfait quoi Emoticone clin d'oeil

11. Par soussou le vendredi 28 novembre 2008 à 10:10

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 vendredi 28 novembre 2008 à 13:01

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

13. Par fillius le vendredi 29 mai 2009 à 16:04

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 mercredi 12 août 2009 à 13:01

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"Emoticone clin d'oeil;
exit();
?>

15. Par med le mercredi 19 août 2009 à 10:10

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 dimanche 04 octobre 2009 à 15:03

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