Перенаправление на предыдущую страницу после входа? 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

Обычный способ сделать это – передать текущую страницу пользователя в форму входа через переменную $_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 теперь должен проверить, 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 при передаче URL-адресов в качестве параметров $_GET . Это кодирует специальные URL-символы (такие как ? & И % ), чтобы они не нарушали ваш URL-адрес (например: login.php?location=comment.php?id=17 <- у этого есть два ? не работает правильно)

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

 $_SERVER['HTTP_REFERER'] 

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

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

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

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

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

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

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

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

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

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

 $_SERVER['HTTP_REFERER']; 

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

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

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

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

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

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

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

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

Постройте действие формы таким образом, чтобы оно «запоминало» или returnurl=value предыдущую страницу, returnurl=value пару URL / значение строки 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>"; 

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

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

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

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

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

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

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

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

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

Ответ @ 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;