Attention aux redirections

Si comme moi, vous avez l’habitude d’utiliser la fonction header('Location: mon_url.php'); pour rediriger vos visiteurs, méfiez-vous. Il faut ajouter un exit; après car, dans certains cas, la redirection ne se fait pas immédiatement et quelques lignes supplémentaires sont exécutées. J’ai cherché un bon moment avant de trouver cette solution dans la documentation PHP. Comme quoi, RTFM est toujours d’actualité.

Au passage, si vous utilisez HTTP 1.1, les URL doivent être absolues et non relatives. (header('Location: http://www.site.com/mon_url.php'); et non pas simplement header('Location: mon_url.php');)

Ce contenu a été publié dans PHP. Vous pouvez le mettre en favoris avec ce permalien.

8 réponses à Attention aux redirections

  1. Fabien dit :

    Il est m?me proposer dans la documentation PHP une fonction qui permet de recr?er le chemin absolu et donc de ne se soucier que du chemin relatif :

    <?php
    header("Location: " . $_SERVER[‘HTTP_HOST’]
    . dirname($_SERVER[‘PHP_SELF’])
    . "/" . $relative_url);
    ?>

  2. solo dit :

    Ce sont des solutions absolues pour pr?venir des erreurs. Mais si on maitrise le contexte de la redirection on peut ne pas utiliser exit. Bien sur qui peut le plus peut le moins 😀

  3. JMF dit :

    solo>Tout ? fait. Le souci c’est que je ne savais pas du tout, et je ne pense pas ?tre le seul, qu’il ?tait possible dans certains cas que l’ex?cution du script continue.

    C’est surtout cela que je voulais soulign? vu que ?a am?ne des bugs tr?s difficiles ? d?busquer car apparemment incoh?rents. 🙂

  4. Nico dit :

    J’ai effectivement pass? un bon moment ? traquer un bug dans ce style. Ca sert de le?on de perdre 2 heures sur un probl?me comme ?a.

  5. Romain dit :

    Le probl?me est que tout le monde croit que cette fonction ne sert qu’? la redirection.
    Une fois ex?cut?e, l’interpr?teur passe ? la ligne suivante. Normal quoi 🙂

  6. pascaltje dit :

    J’utilise:

    include(‘fichier.php’);
    exit;

    pour ?viter les headers qui plantent de temps en temps
    (et maintenant je m’interroge sur les redirections hors site de base)

  7. JMF dit :

    pascaltje> Les fonctions include() et header() n’ont rien ? voir. A moins que je ne sois fatigu?, ce qui n’est pas impossible vu que c’est la fin de semaine, le code que tu proposes ne remplit pas la fonction demand?e.

  8. pascaltje dit :

    Effectivement, ?a n’a rien ? voir…

    mais tout d?pend de l’usage qu’on en fait:
    si je dois faire une redirection (un choix de page) lors des tests de validation du contenu d’un formulaire, l’url je m’en fiche et je passe par l’include() qui a le m?me effet.

    si la redirection est r?elle, alors header() .

Les commentaires sont fermés.