59

我一直在寻找解决方案,但无论我尝试什么,我似乎都无法正确解决。

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

login.php显示登录表单:

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

login-check.php检查是否输入了用户名和密码,用户是否存在,或者他是否已经登录,并向 login.php 发送一个参数p

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

4

18 回答 18

80

一种常见的方法是通过$_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%3D17login.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<- 这有两个?'s 并且无法正常工作)

于 2013-01-25T14:23:23.127 回答
10

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

$_SERVER['HTTP_REFERER']

然后将此值设置到会话中,当他通过身份验证时,使用会话中的 url 将他重定向回来。但是,如果 url 是您的网站,您应该先检查一下。也许他直接从另一个站点来登录:)

于 2013-01-25T14:22:11.813 回答
9

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

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

并返回页面:

header("Location: ". $_SESSION['current_page'])
于 2015-04-22T18:17:06.640 回答
3

您可能应该将要重定向到的 url 放在 POST 变量中。

于 2013-01-25T14:13:09.743 回答
3

由于登录页面是一个单独的页面,我假设您要重定向到用户到达登录页面的页面。

$_SERVER['REQUEST_URI']将仅保留当前页面。你想要做的是使用$_SERVER['HTTP_REFERER']

因此,将 HTTP_REFERER 保存在表单上的隐藏元素中,<input type="hidden" name="referer" value="<?= $_SERVER['HTTP_REFERER'] ?>" />但请记住,在处理表单的 PHP 中,如果登录失败,您将需要一些逻辑来重定向回登录页面,同时还要检查引用者是否实际上是您的网站,如果不是,则重定向回主页。

于 2013-01-25T14:25:06.107 回答
3

另一种方式,使用 SESSION

将当前 URL 分配给会话(在每个页面上使用它)

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

并在您的登录页面中,使用

if(isset($_SESSION['rdrurl']))
header('location: '.$_SESSION['rdrurl']);
else
header('location: http://example.com');
于 2016-07-02T10:32:36.820 回答
2

使用类似的东西

$_SERVER['HTTP_REFERER'];

如果它是一个成功的登录,显示一个链接说“点击这里返回”和一个指向引用者的链接,当页面加载时,使用一些 javascript 来自动加载该页面(不要使用 back() 或其他任何东西功能是因为它不会重新加载页面,并且看起来就像用户从未登录过一样。

于 2013-01-25T14:49:03.367 回答
2

您可以使用 session 来存储登录后要返回的当前页面,如果您正确维护会话,它将适用于其他页面。这是非常有用的技术,因为您可以使用它来开发您的面包屑。

于 2013-01-28T05:12:59.490 回答
1

你应该尝试类似的东西$_SERVER['HTTP_REFERER']

于 2014-01-14T00:08:10.167 回答
1

您应该首先使用 $_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值并重定向上一页。您还应该检查空的参考页面。因为您的用户可以直接访问您的登录页面。


谢谢你。

于 2018-02-25T23:16:47.750 回答
1

我创建了一个函数来存储上一页的 URL

//functions.php

function set_previous_page_url(){

    $current_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"; 
    $previous_url = $_SERVER['HTTP_REFERER'];
    if (!($current_url === $previous_url)){
        $_SESSION['redirect_url'] = $previous_url;
    }
    if(isset($_SESSION['redirect_url'])){
        $url = $_SESSION['redirect_url'];
        return $url;

    } else {
        $url = "index.php";
        return $url;
    }
}

并在 login.php 中调用此函数

// login.php

<?php
// set previous page url to redirect after login
$url = set_previous_page_url();

if(ifItIsMethod('post')){
    if(isset($_POST['username']) && isset($_POST['password'])){
        if (login_user($_POST['username'], $_POST['password'])) {
            redirect($url);
            //unset session defined in set_previous_page_url() function
            if(isset($_SESSION['redirect_url'])){
                unset($_SESSION['redirect_url']);
            }

        } 
    }
}
?>
于 2019-08-11T08:36:35.993 回答
1

你可以使用这个:

$refererpage = $_SERVER['HTTP_REFERER']; //get referer stored in a variable
if (strpos($refererpage, $_SERVER['SERVER_NAME']) == TRUE) { //if the start position of the referer and the server name is equal
    $refvar= $refererpage; //create a mew variable to be used to locate header
} else { //if referer's address is not the same as server name
    $refvar= "index.php"; //set the variable to another direction for this request
}

并在您想要的任何地方添加标题:

header('location: '. $refvr); //set the header location to the referer varaible
于 2020-12-09T00:58:26.730 回答
0

通过将查询字符串键/值对写入 URL 来构造表单操作,使其“记住”或保留上一页returnurl=value- 这可以从重定向到登录的任何页面传递。

于 2013-01-25T14:13:16.950 回答
0

我认为您可能需要 $_SERVER['REQUEST_URI'];

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

这应该采用他们所在的网址并在成功登录后重定向他们。

于 2013-01-25T14:17:16.233 回答
0

这个怎么样 :: javascript+php

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

它将与浏览器中的上一个按钮相同

于 2014-04-26T12:15:16.813 回答
0

在登录页面中使用隐藏输入。像:

<input name="location" value="<?php if(!empty($_SERVER['HTTP_REFERER'])) echo $_SERVER['HTTP_REFERER']; else echo 'products.php'; ?>" type="text" style="display: none;" />
于 2016-01-13T03:35:52.320 回答
0

你可以试试

echo "<SCRIPT>alert(\"Login Successful Redirecting To Previous Page \");history.go(-2)</SCRIPT>";

或者

echo "<SCRIPT>alert(\"Login Successful Redirecting To Previous Page \");history.go(-1)</SCRIPT>";

于 2020-10-06T11:26:24.233 回答
-1

@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;
于 2016-04-04T05:29:19.607 回答