En développement web, il est souvent nécessaire de guider un utilisateur d’une URL à une autre. Une page a été déplacée, un ancien article a été mis à jour, ou vous voulez simplement forcer l’utilisation du HTTPS. C’est le rôle de la redirection. Alors que beaucoup de redirections peuvent être gérées au niveau du serveur, il est parfois indispensable de les programmer directement dans votre code. En PHP, cette tâche est accomplie par une seule et unique fonction : header(). En effet, cette fonction est simple en apparence, mais son utilisation est soumise à des règles très strictes. La comprendre et la maîtriser est essentiel pour éviter deux des erreurs les plus tristement célèbres du développement PHP : les boucles de redirection infinies et la fameuse erreur "Headers already sent".
La méthode : La fonction header()
La fonction header() en PHP permet d’envoyer un en-tête HTTP brut au navigateur. Pour effectuer une redirection, on utilise principalement deux en-têtes : l’un pour spécifier le type de redirection (le code d’état HTTP), et l’autre pour indiquer la nouvelle destination (Location).
Voici le code standard pour une redirection 301 (déplacement permanent), la plus courante et la meilleure pour le SEO :
<?php
// Redirection 301 de l'ancienne page vers la nouvelle
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://www.votresite.com/nouvelle-page.php");
exit();
?>
Décortiquons ce code :
header("HTTP/1.1 301 Moved Permanently");: Cet en-tête informe le navigateur et les moteurs de recherche que la page a été déplacée de façon permanente. C’est une instruction cruciale pour le SEO, car elle demande à Google de transférer toute la "valeur" de l’ancienne URL vers la nouvelle.header("Location: https://www.votresite.com/nouvelle-page.php");: C’est l’instruction qui déclenche réellement la redirection. Le navigateur voit cet en-tête et charge immédiatement la nouvelle URL.exit();: Cette ligne est absolument capitale. Elle met fin immédiatement à l’exécution du script. Sans elle, PHP continuerait d’exécuter le reste de la page, ce qui pourrait entraîner des comportements inattendus et des failles de sécurité.
Piège n°1 à éviter : L’erreur "Headers already sent"
C’est l’erreur la plus courante et la plus déroutante pour les débutants. Le message est clair : "Impossible de modifier les informations d’en-tête – les en-têtes ont déjà été envoyés".
La cause : La communication entre un serveur et un navigateur se fait en deux parties : d’abord les en-têtes (headers), puis le corps de la page (body). Les en-têtes contiennent des métadonnées comme les codes d’état, les cookies, et nos fameuses redirections. Le corps contient le code HTML visible. Une fois que le serveur commence à envoyer le corps (même un seul espace blanc ou une seule ligne de HTML), la porte des en-têtes est fermée. Il est trop tard pour en ajouter ou en modifier.
L’erreur "Headers already sent" se produit si vous essayez d’appeler la fonction header() après qu’un quelconque contenu a été envoyé.
Comment l’éviter : La règle est simple et absolue. Votre logique de redirection doit toujours se trouver tout en haut de votre fichier PHP, avant toute autre chose.
<?php
// CORRECT : Logique de redirection au tout début.
if ( some_condition ) {
header("Location: /nouvelle-page");
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Ma page</title>
</head>
<body>
...
</body>
</html>
<?php
// INCORRECT : Un "echo" a été fait avant le header().
echo "Bonjour !";
header("Location: /nouvelle-page"); // Erreur "Headers already sent"
exit();
?>

Piège n°2 à éviter : Les boucles de redirection
Une boucle de redirection se produit lorsque la page A redirige vers la page B, qui elle-même redirige vers la page A. Le navigateur est pris dans un cycle infini et finit par afficher une erreur du type "ERR_TOO_MANY_REDIRECTS".
La cause : Ce problème est presque toujours dû à une logique de redirection trop large ou mal définie. Par exemple, si vous voulez rediriger tout le trafic non-www vers www, mais que votre règle ne fait pas la distinction et s’applique aussi au trafic déjà sur www.
Comment l’éviter : Votre logique de redirection doit être aussi spécifique que possible. Utilisez des conditions if pour cibler précisément les cas où la redirection doit s’appliquer.
<?php
// Logique de redirection spécifique pour une seule page
if ($_SERVER['REQUEST_URI'] == '/ancienne-page.php') {
header("HTTP/1.1 301 Moved Permanently");
header("Location: /nouvelle-page.php");
exit();
}
?>
En isolant la redirection dans une condition stricte, vous vous assurez qu’elle ne se déclenchera pas de manière inattendue, créant une boucle.
La meilleure approche : Utiliser le bon outil pour le bon travail
Les redirections PHP sont puissantes pour des logiques complexes basées sur le contenu ou les utilisateurs. Cependant, pour des redirections simples et globales (HTTP vers HTTPS, www vers non-www, une page vers une autre), il est souvent plus performant de les gérer au niveau du serveur. Les panneaux de contrôle d’hébergement, comme ceux fournis par Tswan Hosting, offrent des outils graphiques simples pour créer des redirections directement dans le fichier de configuration du serveur (.htaccess pour Apache/LiteSpeed). Cette méthode est plus rapide car elle intercepte la requête avant même que PHP ne soit exécuté.
En conclusion, la redirection PHP via la fonction header() est un outil essentiel, mais qui demande de la rigueur. En plaçant votre code au bon endroit et en utilisant des conditions précises, vous éviterez les pièges courants. Pour des solutions de redirection plus complexes ou pour optimiser la performance de votre site, les experts de Tswan Softwares peuvent vous aider à mettre en place la meilleure stratégie.
