成功登录后如何重定向到引用页面/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"); 
?>

这会将用户重定向到日志.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");
}
?>
登录

表单包含在登录.php中。 与 PHP/log 相关的 login.pho 代码.php为:

<?
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.

我不是 100% 存储引用 URL 的代码应该去哪里,在日志.php或登录.php的顶部。

我尝试将其添加到两者中,但是一旦我输入用户名和密码,登录页面就会循环。

想知道是否有人可以帮助我解决这个问题?

谢谢

缺口

看来我没有特权对您的帖子发表评论,所以我会尽我所能回答。对于所有情况,我深表歉意,我只是尽我所能一时兴起回答。

场景 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:

如果你是以下内容的逻辑,也存在于登录.php文件中......这可能是您的问题。访问您的网站时,我注意到您的表单出现在登录.php时,但您的逻辑正在发布到 log.php。我希望这段代码可以帮助排除"跳转",因为登录.php可能会保存自己并覆盖您建立的 $_SESSION 变量

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

如果它太复杂而无法将其从登录.php文件中取出,如果您甚至在那里,我已经整理了一些代码,您可以使用这些代码来创建"内部"面包屑,因此您可以在历史记录中返回 2 页。

    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
        )
)

所以现在...您可以将 URL 设置为更像以下内容的内容...

// 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() 函数是个坏主意。

说明书规格说;

请记住,在任何实际输出之前必须调用 header() 通过普通 HTML 标记、文件中的空行或从 PHP 发送。 读取包含或要求的代码是一个非常常见的错误 函数或其他文件访问函数,并且具有空格或空 在调用 header() 之前输出的行。同样的问题 使用单个 PHP/HTML 文件时存在。

因此,在您的情况下,我建议使用仅针对会话生成的 ID 的 cookie,在第一次连接时生成,并且 cookie 的持续时间可能只有 2 到 10 分钟。

每次登录时重新生成cookie。PHP被称为!

有好的一天