登录后重定向到上一页? PHP
Posted
技术标签:
【中文标题】登录后重定向到上一页? PHP【英文标题】:Redirecting to previous page after login? PHP 【发布时间】:2013-01-09 12:21:35 【问题描述】:我一直在寻找解决方案,但无论我尝试什么,我似乎都无法正确解决。
成功登录后,用户应该被重定向到他来自的页面,假设他正在浏览一个帖子并想要登录以便他可以发表评论,所以他应该被重定向到他正在浏览的帖子。所以这就是我所拥有的:
login.php 显示登录表单:
<form method="post" action="login-check.php">
... //input for username and password
</form>
login-check.php 检查是否输入了用户名和密码,用户是否存在,或者他是否已经登录,并将p
参数发送到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
【问题讨论】:
您应该将您希望将用户重定向回的页面作为查询参数传递给您的登录页面。 【参考方案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
【讨论】:
【参考方案2】:你可以试试
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>";
【讨论】:
【参考方案3】:我已经创建了一个函数来存储上一页的 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']);
?>
【讨论】:
【参考方案4】:执行此操作的常用方法是通过$_GET
变量将用户的当前页面传递给登录表单。
例如:如果您正在阅读一篇文章,并且想要发表评论。 cmets 的 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
现在应该检查是否填充了 $_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。
在将 URL 作为$_GET
参数传递时,请务必使用urlencode
。这会编码特殊的 URL 字符(例如 ?
、&
和 %
),这样它们就不会破坏您的 url(例如:login.php?location=comment.php?id=17
? 并且不起作用正确)
【讨论】:
@AlejandraUzelac,例如,如果您要注销,请查看此问题并尝试写一个答案,然后您会在页面底部看到一个Log In
链接。此链接指向此处:http://***.com/users/login?returnurl=%2fquestions%2f14523468%2fredirecting-to-previous-page-after-login-php
您会看到此问题的 URL 包含在登录 URL 中。
还有一件事...如果用户想登录,比如说,在 categories.php 中呢?因为没有表单,也没有输入按钮。
让我们continue this discussion in chat
先生,我不明白在这个答案中 login.php 中 htmlspecialchars($_GET['location']) 的使用。由于它将特殊字符如&、'、、等转换为html实体,但URL中的文件名不包含此类字符。在这种情况下使用此函数(htmlspecialchars)是否无效?
嗨@rosemary 这是一种防止XSS 的安全措施。想象一下,我在 Reddit 上发布了 Alejandra 网站的链接:http://example.com/login.php?location=" onload="window.location('malice.com/spyware')
。当您访问此页面时,input
将如下所示:<input type="hidden" name="location" value="example.com/login.php?location=" onload="window.location('malice.com/badwebpage')"
。此 HTML 将用户发送到 malice.com!使用htmlspecialchars
有助于防止这种情况发生。在呈现用户提供的输入时,最好使用htmlspecialchars
【参考方案5】:
您应该首先使用 $_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 值并重定向上一页。您还应该检查空的参考页面。因为您的用户可以直接访问您的登录页面。
谢谢。
【讨论】:
【参考方案6】:另一种方式,使用 SESSION
将当前 URL 分配给会话(在每个页面上使用)
$_SESSION['rdrurl'] = $_SERVER['REQUEST_URI'];
在您的登录页面中,使用
if(isset($_SESSION['rdrurl']))
header('location: '.$_SESSION['rdrurl']);
else
header('location: http://example.com');
【讨论】:
【参考方案7】:@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;
【讨论】:
应始终转义用户提供的变量包括 HTTP Referer @sanmai 对不起,我忘了展示那部分,我编辑了答案。【参考方案8】:在您的登录页面中使用隐藏输入。 喜欢:
<input name="location" value="<?php if(!empty($_SERVER['HTTP_REFERER'])) echo $_SERVER['HTTP_REFERER']; else echo 'products.php'; ?>" type="text" style="display: none;" />
【讨论】:
【参考方案9】:您可以使用 php 保存页面,如下所示:
$_SESSION['current_page'] = $_SERVER['REQUEST_URI']
然后返回页面:
header("Location: ". $_SESSION['current_page'])
【讨论】:
【参考方案10】:这个怎么样 :: javascript+php
echo "<script language=javascript> javascript:history.back();</script>";
它将与浏览器中的上一个按钮相同
【讨论】:
这通常会将用户发送回上一页的缓存版本,这在登录后没有用,因为登录可能会以某种方式更改该页面(显示用户名等)。 我认为在这个公认的答案中,它更像是一个纯粹的 php 解决方案......如果用户禁用 javascript,那么上述将无法工作。【参考方案11】:您应该尝试类似$_SERVER['HTTP_REFERER']
。
【讨论】:
【参考方案12】:您可以使用 session 来存储登录后要返回的当前页面,如果您正确维护会话,它将适用于其他页面。这是一种非常有用的技术,因为您可以使用它来开发面包屑。
【讨论】:
【参考方案13】:使用类似的东西
$_SERVER['HTTP_REFERER'];
如果登录成功,则显示“单击此处返回”链接和指向引荐来源网址的链接,当页面加载时,使用一些 javascript 自动加载该页面(不要使用 back()或者无论该功能是什么,因为它不会重新加载页面,并且看起来就像用户从未登录过一样。
【讨论】:
【参考方案14】:由于登录页面是一个单独的页面,我假设您要重定向到用户到达登录页面的页面。
$_SERVER['REQUEST_URI']
只会保存当前页面。你想做的是使用$_SERVER['HTTP_REFERER']
因此,将 HTTP_REFERER 保存在表单 <input type="hidden" name="referer" value="<?= $_SERVER['HTTP_REFERER'] ?>" />
上的隐藏元素中,但请记住,在处理表单的 PHP 中,如果登录失败,您将需要一些逻辑来重定向回登录页面,同时还要检查referer 实际上是你的网站,如果不是,则重定向回首页。
【讨论】:
【参考方案15】:当用户进入登录页面时,使用它来查看来自哪里
$_SERVER['HTTP_REFERER']
然后将此值设置到会话中,当他通过身份验证时,使用会话中的 url 将他重定向回来。但是,如果 url 是您的网站,您应该先检查一下。也许他直接从另一个站点来登录:)
【讨论】:
这个值是完全不可靠的,例如用户安装了一个浏览器插件,该插件禁止发送referer。 这是使用 HTTP 的标准方式,如果有任何东西阻止从客户端请求中读取该值,那是客户端的问题。【参考方案16】:我认为您可能需要 $_SERVER['REQUEST_URI'];
if(isset($_SESSION['id_login']))
header("Location:" . $_SERVER['REQUEST_URI']);
这应该获取他们所在的网址,并在成功登录后重定向他们。
【讨论】:
如果我添加它,登录页面会显示一条错误消息:“您没有填写表单。”。好像没有会话...【参考方案17】:通过向 URL 写入 returnurl=value
查询字符串键/值对来构造表单操作,使其“记住”或保留上一页 - 这可以从重定向到登录的任何页面传递。
【讨论】:
【参考方案18】:您可能应该将要重定向到的 url 放在 POST 变量中。
【讨论】:
以上是关于登录后重定向到上一页? PHP的主要内容,如果未能解决你的问题,请参考以下文章