it-swarm.com.de

Nach dem Login zur vorherigen Seite weiterleiten? PHP

Ich habe nach einer Lösung gesucht, aber es scheint, dass ich es nicht richtig machen kann, egal was ich versuche. 

Nach dem erfolgreichen Login sollte der Benutzer zu der Seite weitergeleitet werden, von der er gekommen ist. Nehmen wir an, er hat einen Beitrag durchsucht und möchte sich einloggen, damit er einen Kommentar hinterlassen kann. Er sollte also zu dem Beitrag weitergeleitet werden, den er durchsucht hat. Also hier ist was ich habe:

login.php zeigt das Anmeldeformular:

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

Die login-check.php prüft, ob Benutzername und Passwort eingegeben wurden, ob der Benutzer existiert oder ob er bereits angemeldet ist und ein Parameter p an login.php gesendet wird:

<?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 wird an login.php zurückgesendet und zeigt die entsprechende Nachricht an:

<?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");
}
?>

ABER, anstatt nach der erfolgreichen Anmeldung zur index.php zu gehen, sollte die Seite aufgerufen werden, die der Benutzer zuvor war. Ich habe es auf verschiedene Weise versucht, aber es funktioniert überhaupt nicht oder es kehrt zu login.php zurück. Es muss nicht unbedingt sicher sein, weil ich dies für ein Schulprojekt mache.
AUCH, ich halte mich für ziemlich Anfänger, also bitte Geduld haben: D

42

Ein üblicher Weg ist, die aktuelle Seite des Benutzers über eine $_GET-Variable an das Anmeldeformular zu übergeben.

Zum Beispiel: wenn Sie einen Artikel lesen und einen Kommentar hinterlassen möchten. Die URL für Kommentare lautet comment.php?articleid=17. Während comment.php geladen wird, stellt es fest, dass Sie nicht angemeldet sind. Es möchte Sie an login.php senden, wie Sie es bereits gezeigt haben. Wir werden jedoch Ihr Skript so ändern, dass auch die Anmeldeseite aufgefordert wird, sich zu merken, wo Sie sich befinden:

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

Dies sollte den Benutzer an folgende Adresse senden: login.php?location=comment.php%3Farticleid%3D17. login.php sollte nun prüfen, ob $_GET['location'] eingetragen ist. Wenn es ausgefüllt ist, senden Sie den Benutzer an diesen Ort (in diesem Fall comment.php?articleid=17). Zum Beispiel:

//  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

Sie sollten eine Überprüfung gegen $_GET['location'] ausführen, bevor Sie den Benutzer dorthin schicken. Wenn ich beispielsweise Personen, die Ihre Website verwenden, mit einem Klick auf diesen Link sagen: login.php?location=http%3A%2F%2Fmalice.com%2Fevilpage.php..., werden sie an eine fremde URL gesendet, die versucht, etwas Schlechtes zu tun.

Stellen Sie immer sicher, dass Sie urlencode verwenden, wenn Sie URLs als $_GET-Parameter übergeben. Dies verschlüsselt spezielle URL-Zeichen (wie ?, & und %), damit diese Ihre URL nicht beschädigen (z. B. login.php?location=comment.php?id=17 <- dies hat zwei ?s und funktioniert nicht richtig).

63
Chris

Wenn der Benutzer zur Anmeldeseite kommt, verwenden Sie diese, um zu sehen, woher er kommt

$_SERVER['HTTP_REFERER']

Setzen Sie dann diesen Wert in die Sitzung und verwenden Sie bei der Authentifizierung die URL der Sitzung, um ihn zurückzuleiten. Sie sollten jedoch vorher überprüfen, ob die URL Ihre Site ist. Vielleicht kommt er direkt von einer anderen Seite zum einloggen :)

8
Djordje Bakic

Sie können eine Seite mit PHP wie folgt speichern:

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

Und zurück zur Seite mit:

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

Da es sich bei der Anmeldeseite um eine separate Seite handelt, gehe ich davon aus, dass Sie auf die Seite umleiten möchten, von der aus der Benutzer die Anmeldeseite erreicht hat.

$_SERVER['REQUEST_URI'] hält einfach die aktuelle Seite. Sie möchten $_SERVER['HTTP_REFERER'] verwenden

Speichern Sie also den HTTP_REFERER in einem versteckten Element in Ihrem Formular <input type="hidden" name="referer" value="<?= $_SERVER['HTTP_REFERER'] ?>" />. Denken Sie jedoch daran, dass Sie in PHP, das das Formular verarbeitet, eine Logik benötigen, die zurück zur Anmeldeseite führt, wenn die Anmeldung fehlschlägt Ist Ihre Website, falls nicht, dann zurück zur Startseite.

3
philipobenito

Sie sollten die URL, auf die umgeleitet werden soll, wahrscheinlich in eine POST - Variable einfügen. 

3
Tim Martens

Ein anderer Weg, mit SESSION

Aktuelle URL der Session zuweisen (auf jeder Seite verwenden)

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

und auf Ihrer Anmeldeseite verwenden

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

verwenden Sie so etwas wie 

$_SERVER['HTTP_REFERER'];

Wenn es sich um ein erfolgreiches Login handelt, zeigen Sie einen Link mit der Aufschrift "Hier klicken, um zurück zu gehen" und einen Link zum Referrer an. Wenn die Seite geladen wird, verwenden Sie ein Javascript, um diese Seite automatisch zu laden (verwenden Sie nicht back () oder was auch immer) Funktion ist, da die Seite nicht erneut geladen wird und es so aussieht, als wäre der Benutzer nie angemeldet.

2
Drew

Sie können session verwenden, um die aktuelle Seite zu speichern, auf der Sie nach der Anmeldung zurückkehren möchten. Dies funktioniert auch für andere Seiten, wenn Sie die Sitzung ordnungsgemäß verwalten. Es ist eine sehr nützliche Technik, da Sie Ihren Breadcrumb damit entwickeln können.

2
Sandeep Garg

Sie sollten etwas wie $_SERVER['HTTP_REFERER'] versuchen.

1
jpmaster77

Sie sollten zuerst eine Benutzerreferenzseite in einer Variablen erhalten, indem Sie $ _SERVER ['HTTP_REFERER'] verwenden. in Ihrer Login-Seite.

MÖGEN:

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

Wenn der Benutzer nun zum Anmelden klickt, dann ändern Sie den Kopfzeilenspeicherort in Benutzer, siehe Seite 

MÖGEN:

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

In dieser Zeit sollten Sie zunächst prüfen, ob der Benutzer die Seite als leer bezeichnet oder nicht, da Ihr Benutzer Ihre Anmeldeseite direkt besuchen kann. Dann wird Ihre $ refPage-Variable leer sein, nachdem die Click to Login-Seite hier angezeigt wird 

MÖGEN:

<?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
    }
}
?>


Sie können auch den versteckten Eingabetyp verwenden, in dem Sie den Wert $ _SERVER ['HTTP_REFERER'] setzen können.

MÖGEN:

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

Und wenn ein Benutzer zum Anmelden klickt, können Sie die refPage Wert und leiten Sie die vorherige Seite um. Und Sie sollten auch die leere Referenzseite überprüfen. Weil Ihr Benutzer Ihre Anmeldeseite direkt aufrufen kann.


Vielen Dank.

0
Obaidul Haque

Ich habe eine Funktion zum Speichern der URL der vorherigen Seite erstellt

//functions.php

function set_previous_page_url(){

    $current_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://{$_SERVER['HTTP_Host']}{$_SERVER['REQUEST_URI']}"; 
    $previous_url = $_SERVER['HTTP_REFERER'];
    if (!($current_url === $previous_url)){
        $_SESSION['redirect_url'] = $previous_url;
    }
    if(isset($_SESSION['redirect_url'])){
        $url = $_SESSION['redirect_url'];
        return $url;

    } else {
        $url = "index.php";
        return $url;
    }
}

Und rufe diese Funktion in login.php auf

// login.php

<?php
// set previous page url to redirect after login
$url = set_previous_page_url();

if(ifItIsMethod('post')){
    if(isset($_POST['username']) && isset($_POST['password'])){
        if (login_user($_POST['username'], $_POST['password'])) {
            redirect($url);
            //unset session defined in set_previous_page_url() function
            if(isset($_SESSION['redirect_url'])){
                unset($_SESSION['redirect_url']);
            }

        } 
    }
}
?>
0
Adnan

Verwenden Sie versteckte Eingaben auf Ihrer Anmeldeseite .

<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

wie wäre es mit diesem :: javascript + php

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

es funktioniert genauso wie die vorherige Schaltfläche in Ihrem Browser

0

Konstruieren Sie die Formularaktion so, dass sie sich an die vorherige Seite "erinnert", indem sie ein returnurl=value-Abfragezeichenfolge/-wert-Paar an die URL ausschreibt. Dies kann von jeder Seite übergeben werden, die zur Anmeldung umleitet.

0
Grant Thomas

Ich denke, Sie benötigen vielleicht den $ _SERVER ['REQUEST_URI'];

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

Das sollte die URL sein, unter der sie sich befinden, und sie nach einem erfolgreichen Login umleiten.

0
Rob