Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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 blank, let ignore it. Otherwise, let 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

Перед отправкой пользователя вы должны выполнить некоторую проверку на $_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 < - у этого есть два ? и не будут работать правильно )

Ответ 2

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

$_SERVER['HTTP_REFERER']

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

И вернитесь на страницу с помощью:

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

Ответ 6

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

$_SERVER['HTTP_REFERER'];

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

Ответ 7

Другой способ, используя SESSION

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

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

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

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

Ответ 8

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

Ответ 9

Вы должны попробовать что-то вроде $_SERVER['HTTP_REFERER'].

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

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

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

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

Ответ 13

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

Я использовал этот код, и он работает. Большое спасибо.

Ответ 14

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

И вернитесь на страницу с помощью:

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

Этот код работает.

Ответ 15

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

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

Ответ 16

@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;