web-dev-qa-db-fra.com

Redirection vers la page précédente après la connexion? PHP

Je cherchais une solution, mais il semble que je ne puisse pas la bien faire, peu importe ce que j'essaie. 

Après une connexion réussie, l'utilisateur doit être redirigé vers la page d'où il vient, par exemple, il a parcouru un post et veut se connecter pour pouvoir laisser un commentaire. Il doit donc être redirigé vers le post qu'il parcourait. Alors voici ce que j'ai:

login.php affiche le formulaire de connexion:

<form method="post" action="login-check.php">
... //input for username and password
</form>

Le login-check.php vérifie si le nom d'utilisateur et le mot de passe sont entrés, si l'utilisateur existe ou s'il est déjà connecté, et un paramètre p est envoyé à login.php:

<?php
session_start();
if((empty($username) OR empty($password) AND !isset($_SESSION['id_login']))) {
   header("Location:login.php?p=1");
   exit();
}
elseif (!user_exists($username,$password) AND !isset($_SESSION['id_login'])) {
   header("Location:login.php?p=2");
   exit();
}
elseif(isset($_SESSION['id_login'])) {
   header("Location:login.php?p=3");
   exit();
}
?>

p est renvoyé à login.php et affiche le message correspondant:

<?php
if(isset($_GET['p'])) {
  $p = $_GET["p"];

  if($p=="1")
    echo "<p class=\"red\">You didn't fill the form.</p><br></br>";
  if($p=="2")
    echo "<p class=\"red\">User exists.</p><br></br>";
  if($p=="3")
    header("Location: index.php");
}
?>

MAIS, au lieu d'aller à index.php après une connexion réussie, il devrait aller à la page que l'utilisateur a déjà été. J'ai essayé de différentes manières mais si cela ne marche pas du tout ou retourne à login.php. Cela n'a pas besoin d'être très sûr, parce que je le fais pour un projet scolaire.
AUSSI, je me considère comme une jolie novice, alors veuillez patienter: D

42
Alejandra Uzelac

Une méthode courante consiste à transmettre la page actuelle de l'utilisateur au formulaire de connexion via une variable $_GET.

Par exemple: si vous lisez un article et que vous voulez laisser un commentaire. L'URL pour les commentaires est comment.php?articleid=17. Pendant le chargement de comment.php, il constate que vous n'êtes pas connecté. Il souhaite vous envoyer vers login.php, comme vous l'avez indiqué précédemment. Cependant, nous allons modifier votre script pour qu'il indique également à la page de connexion de vous rappeler où vous vous trouvez:

header("Location:login.php?location=" . urlencode($_SERVER['REQUEST_URI']));
// Note: $_SERVER['REQUEST_URI'] is your current page

Cela devrait envoyer l'utilisateur à: login.php?location=comment.php%3Farticleid%3D17. login.php devrait maintenant vérifier si $_GET['location'] est rempli. S'il est rempli, envoyez l'utilisateur à cet emplacement (dans ce cas, comment.php?articleid=17). Par exemple:

//  login.php
echo '<input type="hidden" name="location" value="';
if(isset($_GET['location'])) {
    echo htmlspecialchars($_GET['location']);
}
echo '" />';
//  Will show something like this:
//  <input type="hidden" name="location" value="comment.php?articleid=17" />

//  login-check.php
session_start();

//  our url is now stored as $_POST['location'] (posted from login.php). If it's blank, let's ignore it. Otherwise, let's do something with it.
$redirect = NULL;
if($_POST['location'] != '') {
    $redirect = $_POST['location'];
}

if((empty($username) OR empty($password) AND !isset($_SESSION['id_login']))) {
    $url = 'login.php?p=1';
    // if we have a redirect URL, pass it back to login.php so we don't forget it
    if(isset($redirect)) {
        $url .= '&location=' . urlencode($redirect);
    }
   header("Location: " . $url);
   exit();
}
elseif (!user_exists($username,$password) AND !isset($_SESSION['id_login'])) {
    $url = 'login.php?p=2';
    if(isset($redirect)) {
        $url .= '&location=' . urlencode($redirect);
    }
   header("Location:" . $url);
   exit();
}
elseif(isset($_SESSION['id_login'])) {
    // if login is successful and there is a redirect address, send the user directly there
    if($redirect)) {
        header("Location:". $redirect);
    } else {
        header("Location:login.php?p=3");
    }
    exit();
}

Gotchas

Vous devez exécuter une validation sur $_GET['location'] avant d’envoyer l’utilisateur là. Par exemple, si je dis aux personnes qui utilisent votre site de cliquer sur ce lien: login.php?location=http%3A%2F%2Fmalice.com%2Fevilpage.php..., elles seront alors envoyées vers une URL étrangère qui tentera de faire quelque chose de mal.

Veillez toujours à utiliser urlencode lorsque vous transmettez des URL en tant que paramètres $_GET. Ceci code des caractères URL spéciaux (tels que ?, & et %) afin qu'ils ne cassent pas votre url (par exemple: login.php?location=comment.php?id=17 <- il a deux ? et ne fonctionnera pas correctement).

63
Chris

Lorsque l'utilisateur accède à la page de connexion, utilisez ceci pour voir d'où vient le message.

$_SERVER['HTTP_REFERER']

Définissez ensuite cette valeur dans la session et, lorsqu'il est authentifié, utilisez l'URL de la session pour le rediriger. Mais vous devriez faire quelques vérifications avant, si l'URL est votre site. Peut-être qu'il vient d'un autre site directement pour se connecter :)

8
Djordje Bakic

Vous pouvez enregistrer une page en utilisant php, comme ceci:

$_SESSION['current_page'] = $_SERVER['REQUEST_URI']

Et retournez à la page avec:

header("Location: ". $_SESSION['current_page'])
6
Anthony

Étant donné que la page de connexion est une page distincte, je suppose que vous souhaitez rediriger vers la page à partir de laquelle l'utilisateur a atteint la page de connexion.

$_SERVER['REQUEST_URI'] tiendra simplement la page en cours. Ce que vous voulez faire, c'est utiliser $_SERVER['HTTP_REFERER']

Enregistrez donc HTTP_REFERER dans un élément masqué de votre formulaire <input type="hidden" name="referer" value="<?= $_SERVER['HTTP_REFERER'] ?>" />, mais n'oubliez pas que dans le PHP qui traite le formulaire, vous aurez besoin d'une logique qui redirige la page de connexion en cas d'échec de la connexion, mais aussi pour vérifier que le référent est en fait votre site Web, si ce n’est pas le cas, redirigez-le vers la page d’accueil.

3
philipobenito

Vous devriez probablement placer l'URL vers laquelle vous rediriger dans une variable POST 

3
Tim Martens

Une autre façon, en utilisant SESSION

Attribuer l'URL actuelle à la session (à utiliser sur chaque page)

$_SESSION['rdrurl'] = $_SERVER['REQUEST_URI'];

et dans votre page de connexion, utilisez

if(isset($_SESSION['rdrurl']))
header('location: '.$_SESSION['rdrurl']);
else
header('location: http://example.com');
2
Elyor

utiliser quelque chose comme 

$_SERVER['HTTP_REFERER'];

Et si la connexion est réussie, affichez un lien disant "Cliquez ici pour revenir en arrière" et un lien vers le référent. Lorsque la page est chargée, utilisez du javascript pour charger automatiquement cette page (n'utilisez pas back () ni quoi que ce soit qui fonction est comme il ne rechargera pas la page et il apparaîtra comme l'utilisateur jamais connecté.

2
Drew

Vous pouvez utiliser session pour stocker la page actuelle sur laquelle vous souhaitez retourner après la connexion et cela fonctionnera pour d'autres pages si vous maintenez la session correctement. C'est une technique très utile car vous pouvez développer votre fil d'Ariane en l'utilisant.

2
Sandeep Garg

Vous devriez essayer quelque chose comme $_SERVER['HTTP_REFERER'].

1
jpmaster77

Vous devez d’abord obtenir la page de référence de l’utilisateur dans une variable utilisant $ _SERVER ['HTTP_REFERER']; dans votre page de connexion.

COMME:

<?php 
    session_start();
    $refPage = $_SERVER['HTTP_REFERER']; 
?>

Et maintenant, lorsque l'utilisateur clique sur Connexion, modifie l'emplacement de l'en-tête en page de référence de l'utilisateur 

COMME:

<?php 
if(isset($_POST[login])){
    session_start();
    header('location:' . $refPage);
}
?>

Et pendant ce temps, vous devriez d’abord vérifier que l’utilisateur renvoie la page vide ou non, car votre utilisateur peut accéder directement à votre page de connexion, votre variable $ refPage sera alors vide. Après, la page Cliquez pour vous connecter reste ici 

COMME:

<?php
if(isset($_POST[login])){
    session_start();
    $refPage = $_SERVER['HTTP_REFERER'];  // get reffer page url
    if(empty($refPage)){ 
        header('location: yourredirectpage'); // if ref page is empty then set default redirect page.
    }else{
        header('location:' . $refPage); // or if ref page in not empty then redirect page to reffer page
    }
}
?>


Ou vous pouvez utiliser le type d’entrée masqué pour définir la valeur $ _SERVER ['HTTP_REFERER'];

COMME:

<input type="hidden" name="refPage" value="<?php echo $_SERVER['HTTP_REFERER']; ?>">

Et quand un utilisateur clique pour se connecter, vous pouvez obtenir le refPage valeur et redirige la page précédente. Et vous devriez également vérifier la page de référence vide. Parce que votre utilisateur peut visiter directement votre page de connexion.


Je vous remercie.

0
Obaidul Haque

Utilisez des entrées masquées dans votre page de connexion .

<input name="location" value="<?php if(!empty($_SERVER['HTTP_REFERER'])) echo $_SERVER['HTTP_REFERER']; else echo 'products.php'; ?>" type="text" style="display: none;" />
0
Elyor

que diriez-vous de ceci :: javascript + php

echo "<script language=javascript> javascript:history.back();</script>";

cela fonctionnera comme le bouton précédent de votre navigateur

0
Ritabrata Gautam

Construisez l'action de formulaire de manière à ce qu'elle "se souvienne" de la page précédente ou la conserve, en écrivant une paire clé/valeur de chaîne de requête returnurl=value dans l'URL. Cette action peut être transmise depuis n'importe quelle page redirigeant vers la connexion.

0
Grant Thomas

Je pense que vous pourriez avoir besoin de $ _SERVER ['REQUEST_URI'];

if(isset($_SESSION['id_login'])) {
  header("Location:" . $_SERVER['REQUEST_URI']);
}

Cela devrait prendre l'URL à laquelle ils se trouvent et les rediriger après une connexion réussie.

0
Rob