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。 它不需要超级安全,因为我正在做一个学校项目。
另外,我认为自己是新手,所以请耐心等待
一个常见的方法是通过$_GET
variables将用户的当前页面传递给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%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(); }
陷阱
在发送用户之前,你应该对$_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;