2010-02-21 97 views
9

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

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

+0

好问题,欢迎来到:) :) – 2010-02-22 00:41:59

+0

好的问题,我认为很多程序员需要知道它的答案。谢谢。 – TopDeveloper 2012-01-30 06:48:15

回答

10

你有三种常用的方法:

  1. 在会话中存储的前一页;
  2. 将页面存储为GET变量;或
  3. 执行内部重定向到登录页面。

(1)看起来像:

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

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

(2)除了没有会话变量之外是相似的。相反,您有:

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

要通过重定向。登录页面必须将其作为隐藏的表单域包含在页面中,以向用户提供用户名和密码的请求。

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

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

+2

3.将prev页面存储为GET变量:) – n00b 2010-02-21 23:56:57

4

的方法,我通常使用:

  1. 在您的联系人页面,重定向到登录页面,如果用户没有登录
  2. 在登录页面,使用$_SERVER['HTTP_REFERER']变量(这将是设置为用户来自的页面,即联系页面)并将其作为隐藏字段存储。
  3. 用户登录后,将它们重定向回它们所在的页面。

它的美妙之处在于,它自动适用于所有需要登录的页面,而无需在每个页面上设置会话变量。

需要注意的一点是,登录时应检查引荐者中的页面是否位于您的网站上,而不是完全不同的网站,以防用户碰巧来自Google。

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或通过表单中的隐藏输入字段。

+0

谢谢,它帮助我解决了类似的需求..... – Pushpendra 2011-02-24 06:56:07