成功登录后如何重定向到引用页面/网址?

时间:2012-04-24 18:55:43

标签: php session redirect 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.

我不是100%存储引用URL的代码应该放在log.php或login.php的顶部。

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

我想知道是否有人可以帮助我实现这项工作?

谢谢,

尼克

3 个答案:

答案 0 :(得分:1)

似乎我没有权限对您的帖子发表评论,所以我会尽力回答。我为所有场景道歉,我只是尽我所能地随心所欲地回答。

情景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文件中取出来太复杂了,如果你在那里拿到它,我会把你可以用来创建“内部”面包屑的一些代码放在一起,所以你可以去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
        )

)

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

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

一切顺利,我当然希望这在某种程度上有所帮助。

答案 1 :(得分:0)

IN SCENARIO 4

从客户端测试ajax带有javascript代码的XMLHttpRequest的登录/密码到用于验证的专用脚本(在安全模式https上执行)

如果响应正确,请将登录密码发送到脚本服务器。

Stips:编码密码更安全!

答案 2 :(得分:0)

使用header()函数这是一个坏主意。

手动规范说;

  

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

所以在你的情况下,我建议使用带有ID的cookie只为会话生成,在第一次连接时生成,cookie的持续时间可能只有2到10分钟。

每次调用loging.PHP时重新生成cookie!

度过愉快的一天