【发布时间】:2012-05-03 14:30:12
【问题描述】:
在用户成功登录后,我正在努力设置重定向。
登录页面应该将用户重定向到他们成功登录后被拒绝访问的页面。
例如,如果用户在登录(无会话)之前单击“我的帐户”,那么他们会成功重定向到登录页面,但一旦他们登录,我如何将他们发送回“我的帐户”页面?
我尝试的方法包括$_SESSION['HTTP_REFERER]。
任何帮助将不胜感激。
【问题讨论】:
在用户成功登录后,我正在努力设置重定向。
登录页面应该将用户重定向到他们成功登录后被拒绝访问的页面。
例如,如果用户在登录(无会话)之前单击“我的帐户”,那么他们会成功重定向到登录页面,但一旦他们登录,我如何将他们发送回“我的帐户”页面?
我尝试的方法包括$_SESSION['HTTP_REFERER]。
任何帮助将不胜感激。
【问题讨论】:
使用$_SERVER['HTTP_REFERER'] 是危险的,因为如果用户在尝试登录时收到错误(例如密码错误),则引用者将是同一个登录页面。在将用户重定向到登录页面之前,您应该将返回 URL 存储在会话变量中,然后在他们成功登录后将其重定向到存储的返回 URL。
例如,假设您需要保护page.php,您可以在文件开头有这样的内容:
if (empty($_SESSION['user'])) {
$_SESSION['backURL'] = $_SERVER['REQUEST_URI'];
header('Location: login.php');
exit;
}
然后,在用户成功登录后,您可以填充 $_SESSION['user'] 变量,然后重定向到您存储的 URL,然后将他发送到登录页面(或者如果您不这样做,则转到站点的根目录)无论出于何种原因,都没有存储任何反向 URL):
$backURL = empty($_SESSION['backURL']) ? '/' : $_SESSION['backURL'];
unset($_SESSION['backURL']);
header('Location: ' . $backURL);
exit;
【讨论】:
您应该记住变量中的上次访问页面,例如 $_SESSION["last_page"](不包括登录页面)。用户成功登录后,获取变量的值并将用户重定向到他之前的位置。
您不能使用引荐来源网址。例如,如果用户第一次尝试登录失败,那么在第二次尝试中,他的referer 将是登录页面。
另一种方法是使用 ajax 验证用户身份,无需单独的登录页面。如果登录成功,您可以简单地使用 javascript 刷新页面。
【讨论】:
让进行重定向的页面设置一个会话变量,即该页面的 URL:
session_start();
if (!$logged_id)
{
$_SESSION['redirect_url'] = $_SERVER['PHP_SELF'];
header('Location: login.php');
exit;
}
然后在成功登录后将他们重定向到该 URL:
session_start();
/* Login code goes here */
$redirect_url = (isset($_SESSION['redirect_url'])) ? $_SESSION['redirect_url'] : '/';
unset($_SESSION['redirect_url']);
header("Location: $redirect_url", true. 303);
exit;
【讨论】:
header("Location: " . $_SERVER["HTTP_REFERER"]);
会这样做,但请注意:
在发送自定义标头之前,您不能输出(echo、print_r 等)任何内容。
【讨论】:
试试这个:
<?php
header("Location: " . $_SERVER["HTTP_REFERER"]);
?>
【讨论】: