Редирект на предыдущую страницу после авторизации? РНР
Я искал решение, но, похоже, я не могу получить его правильно, независимо от того, что я пытаюсь.
после успешного входа в систему пользователь должен быть перенаправлен на страницу, с которой он пришел, скажем, он просматривал сообщение и хочет войти, чтобы он мог оставить комментарий, поэтому он должен быть перенаправлен на сообщение, которое он просматривал. Итак, вот что у меня есть:
логин.в PHP показывает форму входа:
<form method="post" action="login-check.php">
... //input for username and password
</form>
на вход-регистрация.в PHP проверяет, введены ли имя пользователя и пропуск, существует ли пользователь или он уже вошел в систему, и параметр p отправляется для входа в систему.на 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 отправляется обратно в логин.в 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");
}
?>
но, вместо того, чтобы проиндексировать.php после успешного входа в систему он должен перейти на страницу, на которой ранее был пользователь. Я пробовал по-разному, но эфир не работает вообще или возвращается к логину.РНР. Этого не должно быть. супер безопасно, потому что я делаю это для школьного проекта.
Кроме того, я считаю себя довольно новичком, поэтому, пожалуйста, имейте терпение :D
15 ответов
обычный способ сделать это-передать текущую страницу пользователя в форму входа через $_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();
}
Gotchas
вы должны выполнить некоторую проверку против $_GET['location']
перед отправкой туда пользователей. Например, если я скажу людям, которые используют ваш сайт, нажмите на эту ссылку:login.php?location=http%3A%2F%2Fmalice.com%2Fevilpage.php
... затем они будут отправлены на внешний URL, который попытается сделать что-то плохое.
всегда обязательно используйте urlencode
при передаче URLs как $_GET
параметры. Это кодирует специальные символы URL (например,?
, &
и %
), чтобы они не нарушали Ваш url (например:login.php?location=comment.php?id=17
?и не будет работать правильно)
когда пользователь попадает на страницу входа в систему используйте это, чтобы увидеть, куда пришел из
$_SERVER['HTTP_REFERER']
затем установите это значение в сеанс, и когда он аутентифицируется, используйте url из сеанса, чтобы перенаправить его обратно. Но вы должны сделать некоторую проверку раньше, если url-адрес является вашим сайтом. Возможно, он пришел с другого сайта прямо для входа:)
вы можете сохранить страницу с помощью php, например:
$_SESSION['current_page'] = $_SERVER['REQUEST_URI']
и вернитесь на страницу с:
header("Location: ". $_SESSION['current_page'])
поскольку страница входа является отдельной страницей, я предполагаю, что вы хотите перенаправить на страницу, с которой пользователь достиг страницы входа.
$_SERVER['REQUEST_URI']
будет просто удерживать текущую страницу. Что вы хотите сделать, это использовать $_SERVER['HTTP_REFERER']
поэтому сохраните HTTP_REFERER в скрытом элементе в своей форме <input type="hidden" name="referer" value="<?= $_SERVER['HTTP_REFERER'] ?>" />
но имейте в виду, что в PHP, который обрабатывает форму, вам понадобится некоторая логика, которая перенаправляет обратно на страницу входа в систему, если вход не удается, но также проверить, что референт на самом деле это ваш сайт, если это не так, а затем перенаправить обратно на главную страницу.
использовать что-то вроде
$_SERVER['HTTP_REFERER'];
и если это успешный вход в систему, отобразите ссылку "нажмите здесь, чтобы вернуться" и ссылку на реферера, и когда страница загружается, используйте javascript для автоматической загрузки этой страницы (не используйте back() или любую другую функцию, поскольку она не будет повторно загружать страницу, и она будет выглядеть так, как будто пользователь никогда не входил в систему.
вы можете использовать сеанс, чтобы сохранить текущую страницу, на которой вы хотите вернуться после входа в систему, и это будет работать для других страниц, если вы поддерживаете сеанс должным образом. Это очень полезная техника, так как вы можете развивать свою хлебную крошку, используя ее.
другой способ, используя SESSION
назначьте текущий URL сессии (используйте его на каждой странице)
$_SESSION['rdrurl'] = $_SERVER['REQUEST_URI'];
и на странице входа в систему используйте
if(isset($_SESSION['rdrurl']))
header('location: '.$_SESSION['rdrurl']);
else
header('location: http://example.com');
создайте действие формы таким образом, чтобы оно "запоминало" или сохраняло предыдущую страницу, написав returnurl=value
пара ключ строки запроса/значение в URL-адрес-это может быть передано с любой страницы, которая перенаправляет на вход.
Я думаю, вам может понадобиться $_SERVER ['REQUEST_URI'];
if(isset($_SESSION['id_login'])) {
header("Location:" . $_SERVER['REQUEST_URI']);
}
Это должно взять url, на котором они находятся, и перенаправить их после успешного входа в систему.
Как насчет этого:: javascript+php
echo "<script language=javascript> javascript:history.back();</script>";
он будет работать так же, как и предыдущая кнопка в вашем браузере
использовать скрытые поля ввода на странице входа в систему. Например:
<input name="location" value="<?php if(!empty($_SERVER['HTTP_REFERER'])) echo $_SERVER['HTTP_REFERER']; else echo 'products.php'; ?>" type="text" style="display: none;" />
сначала вы должны получить страницу ссылки пользователя в переменной, используя $_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 value и перенаправить предыдущую страницу. И вы также должны проверить пустую страницу refer. Потому что ваш пользователь может посетить страницу входа в систему.
Спасибо.
Сначала я создал скрытый ввод, содержащий 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;