2013-01-25 55 views
36

我一直在尋找解決方案,但無論我嘗試什麼,似乎我都搞不清楚了。登錄後重定向到上一頁? PHP

成功登錄後,用戶應該被重定向到他來自的頁面,假設他正在瀏覽帖子並希望登錄,因此他可以留言,所以他應該被重定向到他正在瀏覽的帖子。因此,這裏是我:

的login.php顯示登錄表單:如果用戶名和傳球都進入

<form method="post" action="login-check.php"> 
... //input for username and password 
</form> 

登錄-check.php檢查,並在用戶的存在,或者,如果他已經登錄,並且AP參數發送到的login.php:

<?php 
session_start(); 
if((empty($username) OR empty($password) AND !isset($_SESSION['id_login']))) { 
    header("Location:login.php?p=1"); 
    exit(); 
} 
elseif (!user_exists($username,$password) AND !isset($_SESSION['id_login'])) { 
    header("Location:login.php?p=2"); 
    exit(); 
} 
elseif(isset($_SESSION['id_login'])) { 
    header("Location:login.php?p=3"); 
    exit(); 
} 
?> 

p被送回的login.php並顯示accordi NG消息:

<?php 
if(isset($_GET['p'])) { 
    $p = $_GET["p"]; 

    if($p=="1") 
    echo "<p class=\"red\">You didn't fill the form.</p><br></br>"; 
    if($p=="2") 
    echo "<p class=\"red\">User exists.</p><br></br>"; 
    if($p=="3") 
    header("Location: index.php"); 
} 
?> 

,但不用去成功登錄後到index.php,它應該去的頁面,用戶先前已。我嘗試了不同的方式,但以太它根本不工作,或者它返回到login.php。它不需要超級安全,因爲我正在爲一個學校項目做這件事。
此外,我認爲自己很新手,所以請耐心等待:D

+0

你應該要用戶重定向回,作爲查詢參數的頁面,傳遞給你的登錄頁面。 –

回答

56

一個常見的方法是通過$_GET變量將用戶的當前頁面傳遞到登錄表單。

例如:如果您正在閱讀文章,並且您想發表評論。評論網址是comment.php?articleid=17。雖然comment.php正在加載,但它會注意到您尚未登錄。它想要將您發送到login.php,如您之前所示。但是,我們要改變你的腳本,這樣也告知登錄頁面記住你在哪裏:

header("Location:login.php?location=" . urlencode($_SERVER['REQUEST_URI'])); 
// Note: $_SERVER['REQUEST_URI'] is your current page 

這應該在用戶發送至:login.php?location=comment.php%3Farticleid%3D17login.php現在應該檢查是否有$_GET['location']已填充。如果它已填充,則將用戶發送到此位置(在此例中爲comment.php?articleid=17)。例如:

// login.php 
echo '<input type="hidden" name="location" value="'; 
if(isset($_GET['location'])) { 
    echo htmlspecialchars($_GET['location']); 
} 
echo '" />'; 
// Will show something like this: 
// <input type="hidden" name="location" value="comment.php?articleid=17" /> 

 

// login-check.php 
session_start(); 

// our url is now stored as $_POST['location'] (posted from login.php). If it's blank, let's ignore it. Otherwise, let's do something with it. 
$redirect = NULL; 
if($_POST['location'] != '') { 
    $redirect = $_POST['location']; 
} 

if((empty($username) OR empty($password) AND !isset($_SESSION['id_login']))) { 
    $url = 'login.php?p=1'; 
    // if we have a redirect URL, pass it back to login.php so we don't forget it 
    if(isset($redirect)) { 
     $url .= '&location=' . urlencode($redirect); 
    } 
    header("Location: " . $url); 
    exit(); 
} 
elseif (!user_exists($username,$password) AND !isset($_SESSION['id_login'])) { 
    $url = 'login.php?p=2'; 
    if(isset($redirect)) { 
     $url .= '&location=' . urlencode($redirect); 
    } 
    header("Location:" . $url); 
    exit(); 
} 
elseif(isset($_SESSION['id_login'])) { 
    // if login is successful and there is a redirect address, send the user directly there 
    if($redirect)) { 
     header("Location:". $redirect); 
    } else { 
     header("Location:login.php?p=3"); 
    } 
    exit(); 
} 

陷阱

你應該向用戶發送之前有對運行$_GET['location']一些驗證。例如,如果我告訴使用您的網站的用戶點擊此鏈接:login.php?location=http%3A%2F%2Fmalice.com%2Fevilpage.php ...那麼他們將被髮送到一個外部URL,它會嘗試做一些不好的事情。

當傳遞URL作爲$_GET參數時,務必確保使用urlencode。這種編碼特殊網址字符(如?&,並且%),使它們不會打破你的網址(例如:login.php?location=comment.php?id=17 < - 這樣做有兩個?的,將無法正常工作)

+1

@AlejandraUzelac,例如,如果您要註銷,查看此問題並嘗試寫出答案,那麼您會在頁面底部看到一個「登錄」鏈接。此鏈接指向此處:'http://stackoverflow.com/users/login?returnurl =%2fquestions%2f14523468%2fredirecting-to-previous-page-after-login-php'您會看到包含此​​問題的網址在登錄URL中。 – Chris

+0

它現在有用!感謝您的時間和耐心! –

+0

但是還有一件事......如果用戶想登錄,比如說,在categories.php中呢?因爲沒有表單和沒有輸入按鈕。 –

3

您應該將url重定向到POST變量中。

0

通過向URL寫出一個returnurl=value查詢字符串鍵值對,構建表單操作,以便「記住」或保留上一頁,這可以從任何重定向到登錄的頁面傳遞。

0

我想你可能需要$ _SERVER ['REQUEST_URI'];

if(isset($_SESSION['id_login'])) { 
    header("Location:" . $_SERVER['REQUEST_URI']); 
} 

這應該採取他們在的網址,並在成功登錄後重定向他們。

+0

如果我補充一點,登錄頁面會顯示一條錯誤消息:「您沒有填寫表單。」。 就像沒有會話... –

+0

它確實讓我登錄你,所以這些作品。 –

8

當用戶獲取到登錄頁面,使用該看哪裏是來自

$_SERVER['HTTP_REFERER'] 

那麼這個值設置到會話中,當他從會話驗證使用的URL重定向他回來。但是,如果網址是您的網站,您應該先進行一些檢查。也許他來自另一個站點直接登錄:)

+1

該值完全不可靠,例如用戶安裝了一個瀏覽器插件,禁止發送引用者。 – Andreas

3

由於登錄頁面是一個單獨的頁面,我假設你想重定向到用戶從登錄頁面進入的頁面。

$_SERVER['REQUEST_URI']只會保存當前頁面。你想要做的是使用$_SERVER['HTTP_REFERER']

因此,將HTTP_REFERER保存在表單<input type="hidden" name="referer" value="<?= $_SERVER['HTTP_REFERER'] ?>" />的隱藏元素中,但請記住,在處理表單的PHP中,如果登錄時需要重定向回登錄頁面的邏輯失敗,但也要檢查引用者是否實際上是您的網站,如果不是,則重定向回主頁。

2

使用類似

$_SERVER['HTTP_REFERER']; 

而且如果它是一個成功登錄,顯示一個鏈接說:「點擊這裏回去」,並鏈接到引用,並加載網頁時,自動使用JavaScript來加載該頁面(不要使用back()或其他任何函數,因爲它不會重新加載頁面,並且會顯示爲用戶從未登錄過的頁面。

2

您可以使用session來存儲你想在登錄後返回的當前頁面,如果你正確保持會話,這個頁面可以用於其他頁面。這是非常有用的技術,因爲你可以開發你的麪包屑 使用它。

+0

代碼示例將吸引更多注意力。 :) – learner

1

你應該試試類似$_SERVER['HTTP_REFERER']

0

這個怎麼樣::的JavaScript + PHP

echo "<script language=javascript> javascript:history.back();</script>"; 

,將工作與前一按鈕,在您的瀏覽器

+1

這通常會將用戶返回到上一頁的緩存版本,這在登錄後並不有用,因爲登錄可能會以某種方式(顯示用戶名等)更改該頁面。 – redburn

+0

我認爲在這個被接受的答案它更純粹的PHP解決方案...如果用戶禁用JavaScript,那麼上述將無法正常工作。 – greaterKing

5

您可以使用PHP保存網頁,就像這樣:

$_SESSION['current_page'] = $_SERVER['REQUEST_URI'] 

並返回頁面:

header("Location: ". $_SESSION['current_page']) 
0
if(isset($_SESSION['id_login'])) { 
    header("Location:" . $_SERVER['REQUEST_URI']); 
} 

我使用此代碼,它的工作原理。 非常感謝。

0
$_SESSION['current_page'] = $_SERVER['REQUEST_URI'] 

,並返回到頁面:

header("Location: ". $_SESSION['current_page']) 

此代碼的工作。

+1

爲什麼你重複以前的答案?改爲發表評論。 – whoan

0

在您的登錄頁面中使用隱藏的輸入。 像:

<input name="location" value="<?php if(!empty($_SERVER['HTTP_REFERER'])) echo $_SERVER['HTTP_REFERER']; else echo 'products.php'; ?>" type="text" style="display: none;" /> 
-1

@ philipobenito的回答工作最適合我。
我首先創建包含用戶的HTTP引用

<input type="hidden" name="referer" value="<?= $_SERVER['HTTP_REFERER'] ?>" /> 

,併成功登錄後,我重定向到任何值存儲在隱藏輸入

$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); 
if(!empty($_POST['referer'])){ 
    header('Location: '.$_POST['referer']); 
} 
else{ 
    header('Location: members.php'); //members.php is a page used to send a user to their profile page. 
} 
exit; 
+0

一個應該總是逃避用戶提供的變量**,包括HTTP Referer ** – sanmai

+0

@sanmai對不起,我忘了顯示那部分,我編輯了答案。 –

2

另一種方式的用戶,使用隱藏的輸入會議

分配當前URL會話(使用它的每一頁)

$_SESSION['rdrurl'] = $_SERVER['REQUEST_URI']; 

,並在您的登錄頁面,使用

if(isset($_SESSION['rdrurl'])) 
header('location: '.$_SESSION['rdrurl']); 
else 
header('location: http://example.com'); 
0

你應該先把用戶使用$ _ SERVER的變量引用頁面[「HTTP_REFERER」];在你的登錄頁面。

LIKE:

<?php 
    session_start(); 
    $refPage = $_SERVER['HTTP_REFERER']; 
?> 

而現在,當用戶點擊登錄,然後更改標題的位置,以用戶參考頁

LIKE:

<?php 
if(isset($_POST[login])){ 
    session_start(); 
    header('location:' . $refPage); 
} 
?> 

而在這個時候,你應該首先檢查該用戶引用頁面爲空或不是因爲您的用戶可以直接訪問您的登錄頁面,那麼您的$ refPage變量將爲空,因此點擊後登錄頁面會保留在這裏

LIKE:

<?php 
if(isset($_POST[login])){ 
    session_start(); 
    $refPage = $_SERVER['HTTP_REFERER']; // get reffer page url 
    if(empty($refPage)){ 
     header('location: yourredirectpage'); // if ref page is empty then set default redirect page. 
    }else{ 
     header('location:' . $refPage); // or if ref page in not empty then redirect page to reffer page 
    } 
} 
?> 


或者你可以使用輸入類型隱藏在這裏你可以設定值$ _ SERVER [ 'HTTP_REFERER'];

LIKE:

<input type="hidden" name="refPage" value="<?php echo $_SERVER['HTTP_REFERER']; ?>"> 

而當用戶點擊登錄,那麼你可以得到refPage值和重定向之前的頁面。你還應該檢查空的參考頁面。因爲你的用戶可以直接訪問你的登錄頁面。


謝謝。