Перенаправление на предыдущую страницу после входа в систему? PHP


Я искал решение, но, похоже, я не могу сделать это правильно, что бы я ни пытался.

После успешного входа в систему пользователь должен быть перенаправлен на страницу, с которой он пришел, допустим, он просматривал сообщение и хочет войти, чтобы оставить комментарий, поэтому его следует перенаправить на сообщение, которое он просматривал. Итак, вот что у меня есть:

Login.php показывает форму входа в систему:

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

login-check.php проверяет, соответствует ли имя пользователя и пароль вводятся, существует ли пользователь или он уже вошел в систему, и параметр p отправляется в 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 отправляется обратно в login.php и отображает соответствующее сообщение:

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

НО вместо того, чтобы идти к index.php после успешного входа в систему он должен перейти на страницу, на которой ранее был пользователь. Я пробовал по-разному, но это не работает вообще или возвращается к login.php . Это не обязательно должно быть супер безопасно, потому что я делаю это для школы проект.
КРОМЕ того, я считаю себя довольно новичком, поэтому, пожалуйста, наберитесь терпения: D

Author: Alejandra Uzelac, 2013-01-25

15 answers

Распространенный способ сделать это - передать текущую страницу пользователя в форму входа через переменную $_GET.

Например: если вы читаете статью и хотите оставить комментарий. URL-адрес для комментариев - comment.php?articleid=17. Во время загрузки comment.php он замечает, что вы не вошли в систему. Он хочет отправить вас в login.php, как вы показали ранее. Тем не менее, мы собираемся изменить ваш скрипт, чтобы он также сообщал странице входа, где вы находитесь:

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

Это должно отправить пользователю: login.php?location=comment.php%3Farticleid%3D17. login.php теперь следует проверить, заполнен ли $_GET['location']. Если он заполнен, отправьте пользователя в это местоположение (в данном случае comment.php?articleid=17). Например:

//  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();
}

Попались

Вы должны выполнить некоторую проверку $_GET['location'] перед отправкой пользователя туда. Например, если я скажу людям, которые используют ваш сайт, нажать на эту ссылку: login.php?location=http%3A%2F%2Fmalice.com%2Fevilpage.php... тогда они будут отправлены на иностранный URL-адрес, который попытается сделать что-то плохое.

Всегда делайте обязательно используйте urlencode при передаче URL-адресов в качестве параметров $_GET. Это кодирует специальные символы URL-адреса (такие как ?, &, и %), чтобы они не нарушали ваш URL (например: login.php?location=comment.php?id=17? и они не будут работать правильно)

 59
Author: Chris, 2013-01-25 15:40:29

Когда пользователь попадает на страницу входа, используйте это, чтобы узнать, откуда он пришел

$_SERVER['HTTP_REFERER']

Затем установите это значение в сеансе, и когда он пройдет проверку подлинности, используйте URL-адрес из сеанса, чтобы перенаправить его обратно. Но вам следует предварительно проверить, является ли URL-адрес вашим сайтом. Может быть, он пришел с другого сайта напрямую для входа в систему:)

 8
Author: Djordje Bakic, 2013-01-25 14:22:11

Вы можете сохранить страницу с помощью php, например:

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

И вернитесь на страницу с:

header("Location: ". $_SESSION['current_page'])
 6
Author: Anthony, 2015-06-12 18:56:22

Вероятно, вам следует поместить URL-адрес для перенаправления в переменную POST.

 3
Author: Tim Martens, 2013-01-25 14:13:09

Поскольку страница входа является отдельной страницей, я предполагаю, что вы хотите перенаправить на страницу, с которой пользователь перешел на страницу входа.

$_SERVER['REQUEST_URI'] будет просто удерживать текущую страницу. То, что вы хотите сделать, это использовать $_SERVER['HTTP_REFERER']

Так что сохраните HTTP_REFERER в скрытом элементе вашей формы <input type="hidden" name="referer" value="<?= $_SERVER['HTTP_REFERER'] ?>" />, но имейте в виду, что в PHP, обрабатывающем форму, вам понадобится некоторая логика, которая перенаправляет обратно на страницу входа в систему в случае сбоя входа, а также для проверки того, что реферер на самом деле ваш веб-сайт, если это не так, затем перенаправьте обратно на главную страницу.

 3
Author: philipobenito, 2013-01-25 14:25:06

Используйте что-то вроде

$_SERVER['HTTP_REFERER'];

И если это успешный вход в систему, отобразите ссылку с надписью "Нажмите здесь, чтобы вернуться" и ссылку на ссылку, и когда страница загрузится, используйте некоторый javascript для автоматической загрузки этой страницы (не используйте back() или какую-либо другую функцию, так как она не будет повторно загружать страницу и будет выглядеть так, как будто пользователь никогда не входил в систему.

 2
Author: Drew, 2013-01-25 14:49:03

Вы можете использовать сеанс для сохранения текущей страницы, на которую вы хотите вернуться после входа в систему, и это будет работать для других страниц, если вы правильно поддерживаете сеанс. Это очень полезная техника, так как с ее помощью вы можете развить свою хлебную крошку.

 2
Author: Sandeep Garg, 2013-01-28 05:12:59

Другой способ, используя СЕАНС

Назначьте текущий URL-адрес сеансу (используйте его на каждой странице)

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

И на странице входа в систему используйте

if(isset($_SESSION['rdrurl']))
header('location: '.$_SESSION['rdrurl']);
else
header('location: http://example.com');
 2
Author: Elyor, 2016-07-02 10:32:36

Вам следует попробовать что-то вроде $_SERVER['HTTP_REFERER'].

 1
Author: jpmaster77, 2014-01-14 00:29:54

Создайте действие формы таким образом, чтобы оно "запоминало" или сохраняло предыдущую страницу, записав пару ключ/значение строки запроса returnurl=value в URL-адрес - это может быть передано с любой страницы, которая перенаправляет на вход.

 0
Author: Grant Thomas, 2013-01-25 14:13:16

Я думаю, вам может понадобиться $_SERVER['REQUEST_URI'];

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

Это должно принимать URL-адрес, по которому они находятся, и перенаправлять их после успешного входа в систему.

 0
Author: Rob, 2013-01-25 14:17:16

Как насчет этого::javascript+php

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

Она будет работать так же, как и предыдущая кнопка в вашем браузере

 0
Author: Ritabrata Gautam, 2014-04-26 12:15:16

Используйте скрытый ввод на странице входа в систему. Например:

<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, 2016-01-13 03:35:52

Сначала вы должны получить страницу ссылки на пользователя в переменной, используя $_SERVER['HTTP_REFERER']; на вашей странице входа в систему.

НАПРИМЕР:

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

И теперь, когда пользователь нажимает для входа в систему, измените расположение заголовка на страницу ссылки на пользователя

НАПРИМЕР:

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

И в это время вы должны сначала проверить, что страница, на которую ссылается пользователь, пуста или нет, потому что ваш пользователь может посетить вашу страницу входа, тогда ваша переменная $refpage будет пустой, поэтому после нажатия на страницу входа останется здесь

НАПРИМЕР:

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


Или вы можете использовать скрытый тип ввода, где вы можете задать значение $_SERVER['HTTP_REFERER'];

НАПРИМЕР:

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

И когда пользователь нажимает для входа в систему, вы можете получить значение Refpage и перенаправить предыдущую страницу. И вы также должны проверить пустую страницу ссылок. Потому что ваш пользователь может перейти непосредственно на вашу страницу входа.


Спасибо.

 0
Author: Obaidul Haque, 2018-02-25 23:16:47

Ответ @philipobenito сработал для меня лучше всего.
Сначала я создал скрытый ввод, содержащий HTTP-реферер пользователя

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

И после успешного входа в систему я перенаправил пользователей на любое значение, сохраненное в этом скрытом вводе

$_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, 2016-06-07 09:11:40