簡體   English   中英

成功登錄后如何重定向到引用頁面/ URL?

[英]How do I redirect to referring page/url after successful login?

我知道這個話題已經在Stack上討論過了,我已經看了一些答案,但是對於PHP還是一個新手,我還是有點困惑。 我網站上的每個頁面都需要登錄,因此在頁面加載時將用戶重定向到登錄頁面。 在每個頁面的頂部,我有:

<?
require("log.php");
include_once("config.php"); 
include_once("functions.php"); 
?>

這會將用戶重定向到log.php(添加了新代碼):

<?
session_name("MyLogin");
session_start();

    if(isset($_SESSION['url'])) 
       $url = $_SESSION['url']; // holds url for last page visited.
    else 
       $url = "index.php"; // default page for

if($_GET['action'] == "login") {
$conn = mysql_connect("localhost","",""); // your MySQL connection data
$db = mysql_select_db(""); //put your database name in here 
$name = $_POST['user'];
$q_user = mysql_query("SELECT * FROM users WHERE login='$name'");

if (!$q_user) {
    die(mysql_error());
}

if(mysql_num_rows($q_user) == 1) {

$query = mysql_query("SELECT * FROM users WHERE login='$name'");
$data = mysql_fetch_array($query);
if($_POST['pwd'] == $data['password']) { 
$_SESSION["name"] = $name;
header("Location: http://monthlymixup.com/$url"); // success page. put the URL you want 
exit;
} else {
header("Location: login.php?login=failed&cause=".urlencode('Wrong Password'));
exit;
}
} else {
header("Location: login.php?login=failed&cause=".urlencode('Invalid User'));
exit;
}
}

// if the session is not registered
if(session_is_registered("name") == false) {
header("Location: login.php");
}

?>

登錄表單包含在login.php中。 與PHP / log.php相關的login.pho的代碼為:

<?
session_start();

if($_GET['login'] == "failed") {
print $_GET['cause'];
}
?>

<form name="login_form" id="form" method="post" action="log.php?action=login">

我遇到的答案指出,我應該添加:

session_start(); // starts the session
$_SESSION['url'] = $_SERVER['REQUEST_URI'];

到我做過的每個頁面的頂部(在“ require(“ log.php”);“上方),然后添加:

if(isset($_SESSION['url'])) 
   $url = $_SESSION['url']; // holds url for last page visited.
else 
   $url = "index.php"; // default page for

到我的登錄頁面,並使用以下URL在成功登錄后進行重定向:

header("Location: http://example.com/$url"); // perform correct redirect.

在log.php或login.php的頂部,我不是100%應該存儲引用URL的代碼。

我嘗試將其添加到兩者中,但是一旦輸入用戶名和密碼,登錄頁面就會循環播放。

我想知道是否有人可以幫助我完成這項工作?

謝謝,

缺口

看來我沒有特權對您的帖子發表評論,因此,我將盡我所能回答。 對於所有情況我都表示歉意,我只是盡力想盡辦法回答。

場景1:

如果您確實沒有在代碼中選擇數據庫(如此處所示),可能是您遇到的問題嗎? 請注意,下面的代碼是您發布的代碼。

$db = mysql_select_db(""); //put your database name in here 

場景2:

下面的代碼不是我用過的任何東西,我是否建議您嘗試用下面的代碼替換那行代碼?

if(session_is_registered("name") == false) { // Current
if(isset($_SESSION['name']) == false) { // Potential Replacement

場景3:

如果您出於以下邏輯考慮,則login.php文件中也存在該文件...這可能是您的問題。 訪問您的網站后,我注意到您的表單出現在login.php上,但是您的邏輯正在發布到log.php。 我希望這段代碼可以幫助排除“跳轉”,因為login.php可能會保存自身並覆蓋已建立的$ _SESSION變量

session_start(); // starts the session
$_SESSION['url'] = $_SERVER['REQUEST_URI'];

如果太復雜以至於無法從login.php文件中刪除它,甚至在其中也沒有,我已經整理了一些可用於創建“內部”面包屑的代碼,因此您可以將歷史回溯兩頁。

    if(!isset($_SESSION['internal_breadcrumbs']))
        $_SESSION['internal_breadcrumbs'] = array();

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

    $max_breadcrumbs = 5;

    while(count($_SESSION['internal_breadcrumbs']) > $max_breadcrumbs)
        array_shift($_SESSION['internal_breadcrumbs']);

這將創建一個數組,其中最多包含$ max_breadcrumbs個元素,最后一個頁面位於末尾,如下所示

Array
(
    [internal_breadcrumbs] => Array
        (
            [0] => /other_page.php
            [1] => /other_page.php
            [2] => /other_page.php
            [3] => /user_page.php <-- desired page
            [4] => /login.php <-- most recent page
        )

)

所以現在...您可以將您的網址設置為類似於以下內容...

// I'm doing - 2 to accommodate for zero indexing, to get 1 from the current page
if(isset($_SESSION['internal_breadcrumbs'])) 
    $url = $_SESSION['internal_breadcrumbs'][count($_SESSION['internal_breadcrumbs']) - 2];
else 
   $url = "index.php"; // default page for

一切順利,我當然希望這能有所幫助。

在場景4中

從客戶端測試使用javascript代碼的ajax XMLHttpRequest的登錄名/密碼到專用腳本進行驗證(在模式https上進行以確保安全)

如果響應正確,則將登錄密碼發送到腳本服務器。

提示:編碼密碼更安全!

使用header()函數是個壞主意。

說明書說明;

請記住,必須先通過常規HTML標記,文件中的空白行或從PHP發送任何實際輸出,然后調用header()。 讀取包含,或要求函數或另一個文件訪問函數的代碼,並在調用header()之前輸出空格或空行,這是一個非常常見的錯誤。 使用單個PHP / HTML文件時,存在相同的問題。

因此,在您的情況下,我建議使用僅為會話生成ID的cookie,在第一次連接時生成cookie,並且cookie的持續時間可能僅持續2至10分鍾。

每次調用loging.PHP時都要重新生成cookie!

祝你今天愉快

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM