使用PHP登录后重定向到上一页

时间:2010-02-21 23:53:12

标签: php

假设我想导航到联系页面。但为了到达那里,该网站要求我登录。登录后,我应该被重定向到联系页面,但我在其他地方。我该怎么做才能在登录后将其重定向到我想要的页面?

我有一种强烈的感觉,这与会议有关,但仍然如此。该方法应该是什么?

3 个答案:

答案 0 :(得分:10)

您有三种一般方法:

  1. 将上一页存储在会话中;
  2. 将页面存储为GET变量;或
  3. 执行内部重定向到登录页面。
  4. (1)看起来像:

    <?php
    session_start();
    if (!$_SESSION['userid']) {
      $_SESSION['page'] = '/contact';
      header('Location: /login');
      exit;
    }
    ...
    ?>
    

    成功登录后,检索$_SESSION['page']并重定向。

    (2)类似,只是没有会话变量。相反,你有:

    header('Location: /login?return=/contact');
    

    传递重定向。登录页面必须将其作为隐藏的表单字段包含在页面中,向用户显示用户名和密码的请求。

    (3)类似但不会重定向到单独的页面。相反,每个页面都可能是登录页面。如果用户未登录,则会显示登录表单。该URL仍为“/ contact”。每个页面都将检测并处理登录尝试。

    此方法的优点是减少外部重定向,并且更容易处理提交的表单。我的意思是,假设有人在您的某个页面上填写表单,然后单击“提交”。系统看到他们的登录已过期。如果您将用户重定向到新页面然后重定向回来,他们可能需要重新输入所有表单域。如果您隐式处理登录,则可以将所有表单字段包含为隐藏输入,并在登录后无缝地将其视为原始页面的提交。

答案 1 :(得分:4)

我通常使用的方法:

  1. 如果用户未登录,请在您的联系页面上重定向到登录页面。
  2. 在登录页面上,使用$_SERVER['HTTP_REFERER']变量(将设置为用户来自的页面,即联系页面)并将其存储为隐藏字段。
  3. 用户登录后,将其重定向回他们所在的页面。
  4. 关于这一点的美妙之处在于它可以自动适用于所有需要登录的页面,而无需在每个页面上设置会话变量。

    有一点需要注意:登录时,如果用户碰巧来自Google,则应检查引用中的网页是否在您的网站上,而不是完全不同的网站。

答案 2 :(得分:2)

我倾向于重定向到登录页面,在查询字符串中传递当前URL。

要保护的页面

session_start();

if (!isset($_SESSION['user_id']))
{
    // Fetch current URL
    $this_url = $_SERVER['REQUEST_URI'];

    // Redirect to login page passing current URL
    header('Location: login.php?return_url=' . urlencode($this_url));
    exit;
}

// Continue processing
echo 'Hello from this page';

登录页面

session_start();

// Simulate logging in user
$_SESSION['user_id'] = 1;

// Fetch URL to redirect to
$return_url = isset($_GET['return_url']) ? $_GET['return_url'] : 'site_home.php';

// Redirect back
header('Location: ' . $return_url); 

在上面的代码中,我只是模拟了登录过程。通常用户应该通过表单提交凭据,验证凭据然后用户登录。要重定向到的页面的URL必须是通过这个过程维持。您可以继续在查询字符串中传递URL,也可以通过表单中的隐藏输入字段传递。

相关问题