2010-02-21 64 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