Przekierowanie do poprzedniej strony po zalogowaniu? PHP

Szukałem rozwiązania, ale wydaje się, że nie mogę go dobrze, bez względu na to, co próbuję.

Po pomyślnym zalogowaniu, użytkownik powinien zostać przekierowany do strony, z której przyszedł, powiedzmy, że przeglądał post i chce się zalogować, aby mógł zostawić komentarz, więc powinien zostać przekierowany do Postu, który przeglądał. Oto co mam:

Login.php wyświetla formularz logowania:

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

The login-check.php sprawdza czy nazwa użytkownika i hasło są wpisana, czy użytkownik istnieje, czy jest już zalogowany, a parametr p jest wysyłany do logowania.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 jest odsyłany do login.php i wyświetla komunikat:

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

Ale, zamiast iść do indeksu.php po pomyślnym zalogowaniu, powinno przejść do strony, którą wcześniej był użytkownik. Próbowałem na różne sposoby, ale ether nie działa w ogóle lub powraca do logowania.php. To nie musi być super bezpieczne, bo robię to dla szkoły projekt.
Poza tym uważam się za całkiem nowicjusza, więc proszę o cierpliwość: d

Author: Alejandra Uzelac, 2013-01-25

15 answers

Powszechnym sposobem na to jest przekazanie bieżącej strony Użytkownika do formularza logowania za pomocą zmiennej $_GET.

Na przykład: jeśli czytasz artykuł i chcesz zostawić komentarz. Adres URL komentarzy to comment.php?articleid=17. Podczas wczytywania comment.php zauważysz, że nie jesteś zalogowany. Chce cię wysłać do login.php, Jak pokazałeś wcześniej. Jednak zamierzamy zmienić twój skrypt tak, że to również mówi stronie logowania, aby pamiętać, gdzie jesteś: {]}

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

To powinno wysłać user to: login.php?location=comment.php%3Farticleid%3D17. login.php powinien teraz sprawdzić, czy $_GET['location'] jest wypełniona. Jeśli jest wypełniona, wyślij użytkownika do tej lokalizacji (w tym przypadku comment.php?articleid=17). Na przykład:

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

Przed wysłaniem użytkownika należy uruchomić weryfikację $_GET['location']. Na przykład, jeśli powiem ludziom, którzy używają Twojej witryny, aby kliknęli ten link: login.php?location=http%3A%2F%2Fmalice.com%2Fevilpage.php... następnie zostaną wysłane do zagranicznego adresu URL, który będzie próbował zrobić coś złego.

Zawsze upewnij się aby używać urlencode podczas przekazywania adresów URL jako parametrów $_GET. Koduje specjalne znaki URL (takie jak ?, &, i %), aby nie łamały twojego adresu url (np.: login.php?location=comment.php?id=17 ?'s i nie będzie działać poprawnie)

 59
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-25 15:40:29

Gdy użytkownik dostanie się na stronę logowania użyj tego, aby zobaczyć, skąd pochodzi

$_SERVER['HTTP_REFERER']

Następnie ustaw tę wartość w sesji, a po uwierzytelnieniu użyj adresu url z sesji, aby przekierować go z powrotem. Ale powinieneś wcześniej sprawdzić, czy adres url jest Twoją witryną. Może przyszedł z innej strony bezpośrednio do logowania:)

 8
Author: Djordje Bakic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-25 14:22:11

Możesz zapisać stronę używając php, TAK:

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

I wróć do strony z:

header("Location: ". $_SESSION['current_page'])
 6
Author: Anthony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-12 18:56:22

Powinieneś prawdopodobnie umieścić adres url do przekierowania w zmiennej POST.

 3
Author: Tim Martens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-25 14:13:09

Ponieważ strona logowania jest osobną stroną, zakładam, że chcesz przekierować do strony, z której użytkownik dotarł do strony logowania.

$_SERVER['REQUEST_URI'] będzie po prostu trzymać bieżącą stronę. Co chcesz zrobić to użyć $_SERVER['HTTP_REFERER']

Więc zapisz HTTP_REFERER w ukrytym elemencie w formularzu <input type="hidden" name="referer" value="<?= $_SERVER['HTTP_REFERER'] ?>" /> ale pamiętaj, że w PHP, które przetwarza formularz, będziesz potrzebował logiki, która przekieruje z powrotem do strony logowania, jeśli logowanie się nie powiedzie, ale także aby sprawdzić, czy referer jest rzeczywiście Twoją stroną internetową, jeśli tak nie jest, przekieruj z powrotem na stronę główną.

 3
Author: philipobenito,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-25 14:25:06

Użyj czegoś w rodzaju

$_SERVER['HTTP_REFERER'];

I jeśli jest to pomyślne logowanie, wyświetl link z napisem "Kliknij tutaj, aby wrócić" i link do referrer, a gdy strona ładuje się, użyj javascript, aby automatycznie załadować tę stronę (nie używaj back () lub cokolwiek to jest funkcja, ponieważ nie będzie ponownie załadować stronę i będzie to wyglądać jak użytkownik nigdy nie zalogowany.

 2
Author: Drew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-25 14:49:03

Możesz użyć session to, aby zapisać bieżącą stronę, na której chcesz wrócić po zalogowaniu i będzie to działać dla innych stron, jeśli utrzymasz sesję poprawnie. Jest to bardzo przydatna technika, ponieważ możesz za jej pomocą rozwinąć swoją bułkę tartą.

 2
Author: Sandeep Garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-28 05:12:59

Inny sposób, używając sesji

Przypisz bieżący adres URL do sesji (używaj go na każdej stronie)

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

I na stronie logowania użyj

if(isset($_SESSION['rdrurl']))
header('location: '.$_SESSION['rdrurl']);
else
header('location: http://example.com');
 2
Author: Elyor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-02 10:32:36

Powinieneś spróbować czegoś takiego jak $_SERVER['HTTP_REFERER'].

 1
Author: jpmaster77,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-14 00:29:54

Skonstruuj akcję formularza tak, aby "zapamiętała" lub utrzymywała poprzednią stronę, zapisując returnurl=value Łańcuch zapytania klucz/wartość pary do adresu URL - może to być przekazane z każdej strony, która przekieruje do logowania.

 0
Author: Grant Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-25 14:13:16

Myślę, że możesz potrzebować $_SERVER ['REQUEST_URI'];

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

To powinno pobierać adres url, pod którym się znajdują i przekierowywać je po pomyślnym zalogowaniu.

 0
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-25 14:17:16

Co powiesz na to:: javascript+php

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

Będzie działać tak samo jak poprzedni przycisk w Twojej przeglądarce

 0
Author: Ritabrata Gautam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-26 12:15:16

Użyj ukrytego wejścia na stronie logowania. Like:

<input name="location" value="<?php if(!empty($_SERVER['HTTP_REFERER'])) echo $_SERVER['HTTP_REFERER']; else echo 'products.php'; ?>" type="text" style="display: none;" />
 0
Author: Elyor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-13 03:35:52

Powinieneś najpierw uzyskać Stronę referencji użytkownika w zmiennej za pomocą $_SERVER['HTTP_REFERER']; na stronie logowania.

Jak:

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

A teraz, gdy użytkownik kliknie, aby się zalogować, Zmień lokalizację nagłówka na stronę referencji użytkownika

Jak:

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

I w tym czasie należy najpierw sprawdzić, czy użytkownik odsyła stronę pustą czy nie, ponieważ użytkownik może wejść bezpośrednio na stronę logowania wtedy zmienna $refPage będzie pusta więc po kliknięciu na stronę logowania zostanie tutaj

Jak:

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


Lub możesz użyć typu input hidden, gdzie możesz ustawić wartość $_SERVER ['HTTP_REFERER'];

Jak:

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

A gdy użytkownik kliknie, aby się zalogować, możesz uzyskać refPage wartość i przekierować poprzednią stronę. Powinieneś również sprawdzić pustą stronę poleceń. Ponieważ użytkownik może odwiedzić bezpośrednio stronę logowania.


Dziękuję.

 0
Author: Obaidul Haque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-25 23:16:47

@ Philipobenito odpowiedź zadziałała najlepiej dla mnie.
Po raz pierwszy utworzyłem ukryte wejście, które zawiera referer HTTP użytkownika

<input type="hidden" name="referer" value="<?= $_SERVER['HTTP_REFERER'] ?>" />

I po pomyślnym zalogowaniu przekierowałem użytkowników do dowolnej wartości zapisanej w tym ukrytym wejściu

$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
if(!empty($_POST['referer'])){
    header('Location: '.$_POST['referer']);
}
else{
    header('Location: members.php'); //members.php is a page used to send a user to their profile page.
}
exit;
 -1
Author: Iliya Golik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-07 09:11:40