2009-12-31 137 views
4

是否有任何'最佳實踐'關於如何在登錄到您的網站(特別是PHP)後返回用戶到他們的原始頁面?例如如果我在未登錄的情況下查看StackOverflow問題,如果我登錄,如何確保我返回到此問題?PHP:登錄後返回用戶到他們的原始頁面

從我的研究看來,圍繞$ _SERVER ['HTTP_REFERER']變量提供了很多建議。基本上,你注意到引用者並將其存儲在會話中,然後在完成後重定向到該頁面。

問題在於HTTP_REFERER充其量是不可靠的。

這是由用戶代理設置的。並非所有的用戶代理都會設置它,有些提供了將HTTP_REFERER修改爲功能的功能。總之,它不能真正被信任。
— [http://php.net/manual/en/reserved.variables.server.php]

的引薦任何編輯重定向到該網站的其他方面將通過常規的權限檢查處理。如果引用者被截斷,那麼簡單地將用戶重定向到網站的主頁面而不是他們來自的頁面可能是可以接受的。這似乎是不必要的用戶敵對,但我希望有更好的方法來處理這個問題。

回答

6

在登錄頁面:

<form action="controller/LoginController" method="post"> 
<?php 

if (isset($_SERVER['HTTP_REFERER'])) { 
    echo '<input type="hidden" name="l" value="'.htmlspecialchars($_SERVER['HTTP_REFERER']).'" />'; 
} 

?> 
<!-- the rest of the form --> 
<input type="submit" /> 
</form> 

在登錄控制器,你拿在$_POST['l']值,看看這個URL是否是您自己的網站。如果不是,則重定向到默認頁面,否則重定向到此URL。

如果用戶已經登錄,請確保在登錄頁面上將用戶重定向回主頁或其他內容。這將防止重定向回登錄等情況。

$_SERVER['HTTP_REFERER']是瀏覽器的責任。這也是大部分時間都相當可靠。如果瀏覽器沒有發送,或者您擔心,可以使用會話。

在每個頁面上簡單地將$_SESSION['lastvisitpage']設置爲當前頁面的URL。登錄後,您重定向到$_SESSION['lastvisitpage']

由於$_SERVER['HTTP_REFERER']可以在任何時候由用戶僞造,所以應該始終把任何其他用戶提供的變量視爲正確轉義。

+1

所以HTTP_REFERER * *是標準的方式來做到這一點呢?我喜歡使用'lastpage'會話變量作爲空白引用者的備份的想法。謝謝! – AgentConundrum 2009-12-31 08:58:28

+2

完全沒有問題。但要小心SESSION方法,因爲您永遠不知道用戶是否在他/她的瀏覽器中打開了您網站的多個選項卡。如果這個答案打勾,允許他人知道=) – mauris 2009-12-31 09:01:00

+0

好點(多個標籤)。這看起來似乎最適合多種後備。如果存在隱藏的表單元素,請使用它。如果沒有,請檢查登錄頁面上的HTTP_REFERER並使用它。如果它也是空白的,可以使用會話說的最後一頁,或者將用戶返回到主頁面。這可能歸結爲兩個選項中的哪一個提供更好的用戶體驗的意見。 「主頁」可能比推到你在另一個標籤中打開一個頁面減少混亂,但它是在單頁籤的「尾頁」是可靠的情況下,更糟糕的體驗。 – AgentConundrum 2009-12-31 09:08:33

0

我會建議做一個AJAX調用來登錄用戶和成功的AJAX響應只刷新當前頁面。

+0

你不能讓這樣一個重要的特徵是JavaScript的依賴,除非你能有一個JavaScript的故障安全備份此。 – mauris 2009-12-31 08:55:04

+0

我非常贊同@thephpdeveloper說的話。當JavaScript不可用時,我真的很喜歡一切工作。 – AgentConundrum 2009-12-31 09:00:57

+0

我更喜歡AJAX調用,但我也有一個標準的登錄頁面,如果JavaScript不加載。但是頁面會重定向到主頁面。沒有Javascript =不保存您的位置。 – 2009-12-31 09:23:53

3

如果您自己存儲上次訪問過的頁面,或許是在會話的幫助下,會更好。

如果用戶第一次向您的網站請求一個頁面,請啓動一個新的會話並使用當前URI初始化last-URI。更新此last-URI每當請求另一個頁面,直到它是登錄頁面。現在,如果驗證成功,您可以將用戶重定向到最後一個URI中的URI。

而且,如果您在每個頁面上都有登錄表單,請在存儲當前URI的位置使用隱藏輸入。

+2

-1:關於多標籤問題,請參閱其他問題。 – 2009-12-31 09:21:14

1
if(user_not_logged_in()) 
{ 
    $link = "http://example.com/login?continue=path/to/current/page"; 
    echo '<a href="'.$link.'">Loign</a>'; 
} 

這就是我和Google這樣的網站做的。您需要確保先檢查continue變量,然後再對其進行消毒處理。

另一種選擇是使用AJAX,並允許用戶從任何頁面登錄。用戶登錄後,您通過AJAX提交表單,請求返回時刷新。


我想你可能會問,如果用戶在菜單上的登錄鏈接上點擊明確,你會自動認爲用戶希望被重定向到他們從按下按鈕的頁面。我相信這是邏輯上的缺陷。以StackOverflow。僅僅因爲我按登錄並不意味着我想回到我最後的問題。

不過,也有一些情況下,這將是正確的承擔人要回去,比如如果我upvoted問題,並得到了彈出告訴我登錄。如果我在那裏點擊鏈接,假設我想回去是安全的。但只是導航欄上的登錄鏈接沒有這個含義。

相關問題