1393 votes

Comment faire une redirection en PHP?

Est-il possible de rediriger un utilisateur vers une autre page par le biais de l'utilisation de PHP?

Dire que l'utilisateur passe à www.example.com/page.php et je tiens à les rediriger vers www.example.com/index.php, comment pourrais-je le faire sans l'utilisation d'un meta refresh? Possible?

Cela pourrait même protéger mes pages des utilisateurs non autorisés.

1844voto

markus Points 22871

Résumé des questions / réponses en plus de ma propre deux cents:

1. Réponses de base

Vous pouvez utiliser la fonction header() pour envoyer un en-tête HTTP, mais cela doit être envoyé au navigateur avant tout code HTML ou texte (donc avant l' <!DOCTYPE ...> déclaration, par exemple).

header('Location: '.$newURL);

2. Détails importants

die()

header("Location: http://mydomain.com/myOtherPage.php");
die();

Pourquoi devriez-vous utiliser die(): Le Quotidien WTF

URL absolue

L'URL doit être absolue. Voir la RFC 2616. Mais dans la plupart des cas une URL relative sera accepté.

Les Codes D'État

PHP est le "Lieu"de l'en-tête utilise toujours le HTTP 302-code de redirection, mais ce n'est pas celui que vous devez utiliser. Vous devriez 301 (redirection permanente) ou 303 (autres).

Remarque: le W3C mentionne que le 303-d'en-tête est incompatible avec "beaucoup de pré-HTTP/1.1, les agents utilisateurs. Actuellement utilisé des navigateurs sont tous HTTP/1.1, les agents utilisateurs. Ce n'est pas vrai pour beaucoup d'autres agents utilisateurs comme les araignées et les robots.

3. La Documentation

Les en-Têtes HTTP et la fonction header() en PHP

4. Alternatives

Vous pouvez utiliser la méthode alternative de http_redirect($url); qui a besoin de la PECL paquet pecl à être installé.

5. Des Fonctions D'Assistance

Cette fonction n'intègre pas la 303 code d'état:

function Redirect($url, $permanent = false)
{
    header('Location: ' . $url, true, $permanent ? 301 : 302);

    exit();
}

Redirect('http://www.google.com/', false);

C'est plus souple:

function redirect($url, $statusCode = 303)
{
   header('Location: ' . $url, true, $statusCode);
   die();
}

6. Solution de contournement

Comme mentionné en-tête() redirige seulement le travail avant tout est écrit. Ils échouent en général si invoquée inmidst HTML de sortie. Ensuite, vous pouvez utiliser un en-tête HTML d'une solution (pas très professionnel!) comme:

 <meta http-equiv="Location" content="http://example.com/">

Ou une redirection Javascript même.

139voto

vartec Points 53382

Utiliser header() fonction pour envoyer HTTP Location - tête:

header('Location: '.$newURL);

Contrairement à ce que certains pensent, die() n'a rien à voir avec la redirection. L'utiliser uniquement si vous souhaitez rediriger au lieu de l'exécution normale.

example.php:

<?php 
header('Location: static.html');
$fh = fopen('/tmp/track.txt','a');
fwrite($fh, $_SERVER['REMOTE_ADDR'].' '.date('c')."\n");
fclose($fh);
?>

Résultat ou 3 exécutions:

bart@hal9k:~> cat /tmp/track.txt
127.0.0.1 2009-04-21T09:50:02+02:00
127.0.0.1 2009-04-21T09:50:05+02:00
127.0.0.1 2009-04-21T09:50:08+02:00

La reprise obligatoire die()/exit() est certains légende urbaine, qui n'a rien à voir avec PHP. N'a rien à voir avec le client "respect" Location: - tête. L'envoi de l'en-tête n'arrête pas de PHP exécution, quel que soit le logiciel utilisé.

118voto

Alix Axel Points 63455
function Redirect($url, $permanent = false)
{
    if (headers_sent() === false)
    {
    	header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);
    }

    exit();
}

Redirect('http://www.google.com/', false);

N'oubliez pas de mourir()/exit()!

105voto

Nick Points 2689

Sortie du JavaScript à partir de PHP à l'aide de l'écho, qui va faire le travail.

echo '<script type="text/javascript">
           window.location = "http://www.google.com/"
      </script>';

Vous ne pouvez pas vraiment faire ça en PHP, à moins que vous le tampon de sortie de page, puis plus tard pour rediriger condition. Qui pourrait être de trop de tracas. Rappelez-vous que les en-têtes sont la première chose qui est envoyé à partir de la page. La plupart de la redirection est généralement nécessaire plus tard dans la page. Pour cela, vous devez tampon de la sortie de la page et cochez pour rediriger état plus tard. À ce stade, vous pouvez soit rediriger l'utilisateur sur la page de l'en-tête (ou simplement de l'écho de la mémoire tampon de sortie.

Pour en savoir plus sur mise en mémoire tampon (avantages)

Qu'est-ce que le Tampon de Sortie?

56voto

nickf Points 185423

La plupart de ces réponses sont le fait d'oublier une très importante étape!

header("Location: myOtherPage.php");
die();

Laissant que l'essentiel de la seconde ligne, vous pourriez vous voir finir sur Le Quotidien WTF. Le problème est que les navigateurs ne pas avoir à respecter les en-têtes de votre page de retour, donc, avec les en-têtes d'être ignoré, le reste de la page sera exécutée sans une redirection.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X