【问题标题】:PHP redirect back to previous pagePHP 重定向回上一页
【发布时间】:2013-07-24 17:08:39
【问题描述】:

我对 login.php 页面所做的是,如果用户已登录,他将被重定向到 first.php 页面。

session_start();
if(isset($_SESSION['usr']) && isset($_SESSION['pswd'])){
    header("Location: first.php");
} 

在所有其他页面中,如果用户尚未登录,他将被重定向到 login.php 页面。

session_start();
if(!isset($_SESSION['usr']) || !isset($_SESSION['pswd'])){
    header("Location: login.php");
} 

问题来了:有没有办法将用户重定向回他原来的位置?假设您在未登录时尝试访问 second.php,您现在将被重定向到 login.php 页面;登录后,是否可以将您重定向回 second.php 而不是 first.php?

我尝试使用$_SERVER['HTTP_REFERER'],但这个变量不包含任何内容;只有当你因为点击了一个链接而来到这里时,它才会包含一些东西。

【问题讨论】:

  • 您可以将上一页作为参数附加到 login.php 为login.php?redir=previous,然后在登录页面上再次登录后重定向到该页面
  • @Akam 这是一种非常直接的方法,可以让它工作,你的解释比代码更容易理解

标签: php session redirect http-referer


【解决方案1】:
  1. 在他们尝试登录的页面上设置一个包含该页面 URL 的会话变量。
  2. 然后将它们重定向到登录页面。
  3. 成功登录后,从他们的会话中获取上一个 URL 并将其重定向到那里。

让执行重定向的页面设置一个会话变量,即该页面的 URL:

session_start();
if (!$logged_in)
{
    $_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;

以上内容可以改进,但这应该会给你这个想法。

【讨论】:

  • 这就是我现在的做法。唯一的区别是 unset($_SESSION['redirect_url']) 不能杀死我的 URL 会话变量,所以我在注销页面中使用 session_destroy() 来实现相同的目的。谢谢约翰。
【解决方案2】:

$_SERVER['HTTP_REFERER'] 取决于 Web 浏览器,并非所有浏览器都会将引荐来源网址发送回服务器。许多大型网站使用的一种更好的方法是将当前页面传递给登录页面:

header("Location: first.php?".$currentPageUrl);

$currentPageUrl 可以从 $_SERVER['REQUEST_URI'] 或 $_SERVER['PHP_SELF'] 中获取;

登录后,您可以再次将用户重定向到 $currentPageUrl。

除此之外,将用户名和密码存储在 $_SESSION 中听起来并不正确,但这是一个单独的问题。

【讨论】:

  • 我试过这个,几乎就在那里。如果我对网址进行硬编码,那就没问题了。但是,在我的情况下,$_SERVER['REQUEST_URI'] 和 $_SERVER['PHP_SELF'] 都不能顺利运行,因为我的页面位于子目录中,它们将在其 url 中包含该目录。它们可以得到解决,但需要进行额外的更改。谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 2013-01-09
相关资源
最近更新 更多