HOWTO · PHP
Redirection en PHP
Ce tutoriel montre comment rediriger un utilisateur d'une page vers une autre page en PHP
Sur cette page
Pour rediriger une requête en PHP, envoyez un en-tête de réponse Location avec header() avant que le script n’émette du HTML ou tout autre contenu, puis arrêtez son exécution. L’exemple ci-dessous dirige le navigateur vers une URL de destination. Placez le fichier PHP sur un serveur web local et ouvrez-le dans un navigateur pour voir la navigation.
Rediriger vers une URL avec la fonction header() de PHP
La fonction header() envoie un en-tête de réponse HTTP. Pour une redirection, le champ d’en-tête est Location et sa valeur correspond à l’URL de destination. PHP doit envoyer cet en-tête avant tout contenu du corps de la réponse, y compris les espaces situés hors des balises PHP. Placez le code de redirection au début du gestionnaire de requête, avant les modèles ou tout affichage de la page.
Cet exemple autonome stocke l’URL de destination dans une variable. L’appel à exit met fin à la requête en cours après la préparation de la réponse : le reste de la page ne s’exécute donc pas comme si la redirection n’avait pas eu lieu. Le contrôle d’exécution fourni a exécuté cet exemple avec succès, sans produire de sortie standard ; une redirection est transmise dans la réponse HTTP, elle ne s’affiche pas sous forme de texte. Dans un navigateur, l’ouverture du fichier PHP via votre serveur web local devrait vous conduire à la destination indiquée dans l’exemple.
<?php
$url = 'https://example.com/';
header('Location: ' . $url);
exit;
?>
Utilisez une URL vers laquelle votre application est autorisée à envoyer les utilisateurs. Si la destination provient de données de requête, vérifiez-la à l’aide d’une liste d’autorisation ou construisez-la à partir de routes fiables de l’application. Une redirection fondée sur une entrée utilisateur arbitraire peut envoyer les visiteurs vers un site non souhaité. Pour une route de la même application, un chemin tel que /account/ suffit souvent.
Créer une fonction d’aide de redirection PHP avec un code d’état HTTP
Une fonction réutilisable redirect peut recevoir à la fois la destination et le code d’état de la réponse. Le troisième argument de header() correspond au code d’état ; le deuxième détermine si un en-tête portant le même nom remplace un en-tête précédent. La fonction ci-dessous utilise 302 par défaut, un code courant pour une redirection temporaire, et accepte un autre code si la route l’exige.
<?php
function redirect(string $url, int $statusCode = 302): void
{
header('Location: ' . $url, true, $statusCode);
exit;
}
redirect('https://example.com/', 301);
?>
L’exemple transmet 301 pour indiquer que cette destination est permanente. N’utilisez ce code que si le déplacement est destiné à durer : les navigateurs et d’autres clients peuvent mémoriser les redirections permanentes. Le code 302 indique une redirection temporaire et constitue un meilleur choix par défaut lorsque la destination peut changer. Le manuel PHP sur header() documente les paramètres de la fonction, et la référence MDN sur le code 301 décrit ce statut permanent.
Le contrôle d’exécution fourni a exécuté avec succès cet exemple de fonction, sans produire de sortie standard ; le code de redirection et l’en-tête Location font partie de la réponse HTTP et ne sont pas affichés comme du texte. Exécutez le fichier PHP via un serveur web local pour observer la navigation du navigateur. La fonction met fin à la requête après avoir défini l’en-tête de réponse. Dans une application réelle, vérifiez l’URL avant d’appeler la fonction et choisissez un code d’état adapté au caractère temporaire ou permanent du déplacement. L’en-tête Location et le code d’état font partie de la réponse HTTP : cette méthode fonctionne donc avant que le navigateur ne reçoive le corps de la page.
Utiliser JavaScript comme solution de repli pour une redirection côté client
Lorsqu’une redirection côté serveur n’est pas possible, une page peut demander au navigateur de naviguer avec window.location. Il s’agit d’une navigation côté client : PHP envoie le contenu de la page et le navigateur exécute le script. Ce n’est pas de la mise en tampon de sortie PHP et cela ne transforme pas la réponse HTTP en redirection côté serveur. Cette méthode dépend aussi de l’activation de JavaScript ; privilégiez donc header() en PHP lorsque le serveur peut déterminer la destination avant l’envoi de la page.
L’extrait ci-dessous montre cette solution de repli dans une page de navigateur. Ajoutez-le à une page que le serveur web local peut servir, puis ouvrez cette page dans un navigateur où JavaScript est activé pour voir la navigation vers la destination. L’extrait est présenté comme du code source destiné au navigateur et n’a pas été exécuté pour cet article.
<script>
window.location = "https://example.com/";
</script>
Comme ce code s’exécute dans le navigateur, il ne peut pas envoyer un code d’état de redirection HTTP tel que 301 dans la réponse déjà reçue. Gardez la destination fixe ou vérifiez toute valeur utilisée pour la construire, comme vous le feriez pour une redirection côté serveur. Utilisez cette solution de repli seulement si la navigation côté client convient à la page ; les visiteurs ayant désactivé JavaScript resteront sur la page d’origine.