登录后重定向到上一页?PHP

Ale*_*lac 48 php redirect login

我一直在寻找解决方案,但无论我尝试什么,似乎无法做到这一点.

成功登录后,用户应该被重定向到他来自的页面,假设他一直在浏览帖子并想要登录以便他可以发表评论,所以他应该被重定向到他正在浏览的帖子.所以这就是我所拥有的:

login.php显示登录表单:

<form method="post" action="login-check.php">
... //input for username and password
</form>
Run Code Online (Sandbox Code Playgroud)

登录-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();
}
?>
Run Code Online (Sandbox Code Playgroud)

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");
}
?>
Run Code Online (Sandbox Code Playgroud)

但是,成功登录后不是去index.php,而应该转到用户之前的页面.我尝试过不同的方法,但以太它根本不起作用,或者返回login.php.它不需要超级安全,因为我正在为学校项目这样做.
此外,我认为自己很新手,所以请耐心等待:D

Chr*_*ris 71

执行此操作的常用方法是通过$_GET变量将用户的当前页面传递给Login表单.

例如:如果您正在阅读文章,并且您想发表评论.评论的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
Run Code Online (Sandbox Code Playgroud)

这应该将用户发送到: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" />
Run Code Online (Sandbox Code Playgroud)

 

//  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();
}
Run Code Online (Sandbox Code Playgroud)

陷阱

$_GET['location']在将用户发送到那里之前,您应该运行一些验证.例如,如果我告诉使用您网站的用户点击此链接:login.php?location=http%3A%2F%2Fmalice.com%2Fevilpage.php...那么他们将被发送到外国网址,该网址会尝试做坏事.

始终确保urlencode在将URL作为$_GET参数传递时使用.这种编码特殊网址字符(例如?,&%),以便它们不会打破你的URL(如:login.php?location=comment.php?id=17< -这样做有两个?的,将无法正常工作)


小智 8

当用户进入登录页面时,使用它来查看来自哪里

$_SERVER['HTTP_REFERER']
Run Code Online (Sandbox Code Playgroud)

然后将此值设置为会话,并在对其进行身份验证时,使用会话中的url将其重定向回来.但如果网址是你的网站,你应该先做一些检查.也许他来自另一个网站直接登录:)

  • 该值完全不可靠,例如,用户安装了浏览器插件,禁止发送引用者. (3认同)

小智 7

您可以使用php保存页面,如下所示:

$_SESSION['current_page'] = $_SERVER['REQUEST_URI']
Run Code Online (Sandbox Code Playgroud)

并返回页面:

header("Location: ". $_SESSION['current_page'])
Run Code Online (Sandbox Code Playgroud)