Question Comment faire une redirection en PHP?


Est-il possible de rediriger un utilisateur vers une autre page grâce à PHP?

Dire que l'utilisateur va à www.example.com/page.php et je veux les rediriger vers www.example.com/index.php, comment ferais-je sans l'utilisation d'un meta refresh? Possible?

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


983
2018-04-20 14:13


origine


Réponses:


Résumé des réponses existantes plus mes deux cents:

1. Réponse de base

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

header('Location: '.$newURL);

2. Détails importants

mourir() ou Sortie()

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

Pourquoi devriez-vous utiliser die() ou exit(): Le Daily WTF

URL absolue

L'URL doit être un absolu. Voir RFC 2616. Mais dans la plupart des cas, une URL relative sera également acceptée.

Codes d'état

Le "Location" -header de PHP utilise toujours le HTTP 302-redirect code, mais ce n'est pas celui que vous devriez utiliser. Vous devriez considérer soit 301 (redirection permanente) ou 303 (autre).

Remarque: W3C mentions que l'en-tête 303 est incompatible avec "de nombreux agents utilisateurs pré-HTTP / 1.1 Les navigateurs actuellement utilisés sont tous des agents utilisateurs HTTP / 1.1 Ceci n'est pas vrai pour de nombreux autres agents utilisateurs comme les robots et les robots.

3. Documentation

En-têtes HTTP et le header() Fonction 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. Fonctions auxiliaires

Cette fonction n'incorpore pas le code d'état 303:

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

    exit();
}

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

Ceci est plus flexible:

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

6. Solution de contournement

Comme mentionné header() redirige seulement le travail avant que quelque chose ne soit écrit. Ils échouent généralement si invoqué en HTML sortie. Ensuite, vous pouvez utiliser une solution de contournement d'en-tête HTML (pas très professionnel!) Comme:

 <meta http-equiv="refresh" content="0;url=finalpage.html">

Ou une redirection JavaScript même.

window.location.replace("http://example.com/");

1402
2018-04-20 14:19



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

    exit();
}

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

Ne pas oublier de mourir () / exit ()!


89
2018-06-27 07:24



Sortie JavaScript à partir de PHP en utilisant echo, qui fera le travail.

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

Vous ne pouvez pas vraiment le faire en PHP, sauf si vous mettez en tampon la sortie de la page et ensuite vérifier la condition de redirection. Ce pourrait être trop de tracas. Rappelez-vous que les en-têtes sont la première chose qui est envoyée depuis la page. La plus grande partie de la redirection est généralement requise plus tard dans la page. Pour cela, vous devez mettre en mémoire tampon toutes les sorties de la page et vérifier la condition de redirection plus tard. À ce stade, vous pouvez rediriger l'en-tête de l'utilisateur de la page () ou simplement renvoyer la sortie mise en mémoire tampon.

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

Qu'est-ce que le buffer de sortie?


86
2018-04-20 14:14



Utilisation header() fonction envoyer HTTP Location entête:

header('Location: '.$newURL);

Contrairement à certains, die() n'a rien à voir avec la redirection. Utilise le seulement si vous voulez rediriger au lieu d'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

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


79
2018-04-13 12:44



1. En utilisant la fonction d'en-tête avec exit()

<?php 
     header('Location: target-page.php');
     exit();
?>

mais si vous utilisez la fonction d'en-tête alors quelques fois vous obtiendrez "Attention  comme l'en-tête déjà envoyé " pour résoudre cela ne pas écho ou imprimer avant d'envoyer des en-têtes ou vous pouvez simplement utiliser die() ou exit() après la fonction d'en-tête.

2. Sans en-tête

<?php 
    echo "<script>location.href='target-page.php';</script>";
?>

ici vous ne rencontrerez aucun problème

3. En utilisant la fonction d'en-tête avec ob_start() et ob_end_flush()

<?php
ob_start(); //this should be first line of your page
header('Location: target-page.php');
ob_end_flush(); //this should be last line of your page
?>

57
2018-04-20 14:24



La plupart de ces réponses oublient très étape importante!

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

Laissant cette deuxième ligne vitale sur peut-être vous voir finir sur Le Daily WTF. Le problème est que les navigateurs ne avoir Pour respecter les en-têtes renvoyés par votre page, les en-têtes étant ignorés, le reste de la page sera exécuté sans redirection.


49
2018-05-16 13:12



<?php header('Location: another-php-file.php'); exit(); ?>

ou si vous avez déjà ouvert des balises php, utilisez ceci:

header('Location: another-php-file.php'); exit();

Vous pouvez également rediriger vers des pages externes, par exemple:

header('Location: https://www.google.com'); exit();

Assurez-vous d'inclure exit() ou include die()


23
2018-01-15 04:21



Beaucoup de ces réponses sont correctes, mais ils supposent que vous avez une URL absolue, ce qui peut ne pas être le cas. Si vous voulez utiliser un URL relative et générer le reste, alors vous pouvez faire quelque chose comme ça ...

$url = 'http://' . $_SERVER['HTTP_HOST'];            // Get the server
$url .= rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); // Get the current directory
$url .= '/your-relative/path-goes/here/';            // <-- Your relative path
header('Location: ' . $url, true, 302);              // Use either 301 or 302

18
2017-09-09 10:48



Vous pouvez utiliser des variables de session pour contrôler l'accès aux pages et autoriser des utilisateurs valides.

<?php

session_start();

if ( !isset( $_SESSION["valid_user"]) )
{
    header("location:../");
   die();
}

// Page goes here
?>

http://php.net/manual/en/reserved.variables.session.php.

Récemment, j'ai eu des cyber-attaques et j'ai décidé de connaître les utilisateurs qui essayaient d'accéder au panneau d'administration ou à la partie réservée de l'application web.

Ainsi, j'ai ajouté un journal d'accès IP et des sessions utilisateur dans un fichier texte, car je ne veux pas déranger ma base de données.


17
2018-04-28 21:31