login后redirect到上一页 PHP

我一直在寻找一个解决scheme,但似乎我无法做到,无论我尝试什么。

成功login后,用户应该被redirect到他来自的页面,假设他正在浏览post并想login,所以他可以发表评论,所以他应该被redirect到他正在浏览的post。 所以这里是我所拥有的:

login.php显示login表单:

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

login-check.php检查是否input用户名和密码,用户是否存在,或者他是否已经login,并将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"); } ?> 

但是,成功login后,而不是去index.php,它应该去用户以前的页面。 我尝试了不同的方式,但乙醚它不工作或返回到login.php。 它不需要超级安全,因为我正在做一个学校项目。
另外,我认为自己是新手,所以请耐心等待

一个常见的方法是通过$_GETvariables将用户的当前页面传递给login表单。

例如:如果您正在阅读文章,并且想要发表评论。 评论的URL是comment.php?articleid=17 。 虽然comment.php正在加载,但它注意到你没有login。它想要把你发送到login.php ,就像你之前展示的那样。 不过,我们要改变你的脚本,这也是告诉login页面,记住你在哪里:

 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']进行validation。 例如,如果我告诉用户使用您的网站点击此链接: login.php?location=http%3A%2F%2Fmalice.com%2Fevilpage.php …然后他们将被发送到一个外部URL尝试做坏事。

在传递URL作为$_GET参数时,务必确保使用urlencode 。 这将编码特殊的URL字符(如?&% ),以便它们不会破坏您的url(例如: login.php?location=comment.php?id=17 < – 这有两个?不正常工作)

当用户进入login页面时,使用这个来查看来自哪里

 $_SERVER['HTTP_REFERER'] 

然后将这个值设置到会话中,当他被authentication时,使用会话中的url将他redirect回去。 但是,如果URL是你的网站,你应该做一些检查。 也许他来自另一个网站直接login:)

你应该把这个urlredirect到一个POSTvariables中。

由于login页面是一个单独的页面,我假设你要redirect到用户从login页面到达的页面。

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

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

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

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

并返回到页面:

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

使用类似的东西

 $_SERVER['HTTP_REFERER']; 

如果这是一个成功的login,显示一个链接,说“点击这里回去”和链接到引用,并加载页面时,使用一些JavaScript来自动加载该页面(不要使用回()或任何function是因为它不会重新加载页面,它会出现像用户从未login。

另一种方式,使用SESSION

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

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

并在你的login页面中使用

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

您可以使用session来存储login后要返回的当前页面,如果正确保持会话,则可以用于其他页面。 这是非常有用的技术,因为你可以使用它开发你的面包屑。

你应该尝试像$_SERVER['HTTP_REFERER']

通过向URL写出一个returnurl=value查询string键/值对,构build表单操作以便“记住”或保留上一页,这可以从任何redirect到login的页面传递。

我想你可能需要$ _SERVER ['REQUEST_URI'];

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

这应该采取他们所在的url,并在成功login后redirect他们。

怎么样这个:: JavaScript + PHP

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

它将与您的浏览器中的上一个button一样工作

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

我用这个代码,它的工作原理。 非常感谢。

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

并返回到页面:

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

此代码工作。

在你的login页面使用隐藏的input。 喜欢:

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

@ philipobenito的答案对我来说是最好的。
我首先创build了一个隐藏的input,包含用户的HTTP引用

 <input type="hidden" name="referer" value="<?= $_SERVER['HTTP_REFERER'] ?>" /> 

在成功login后,我将用户redirect到隐藏input中存储的任何值

 $_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;