登录后无法重定向回到上一页

时间:2015-05-03 20:16:17

标签: php redirect login authorization

我需要将用户重定向到他们成功执行以下两项操作之一后的页面:1)输入他们的邀请码,或2)登录。

我正在尝试应用here发布的答案,但在花了几个小时试图让它上班失败后,我意识到是时候寻求帮助了。

为了削减代码,我只包含了与选项1(邀请代码)相关的代码段。此外,为了首先使用更简单的版本(并且更密切地复制给定的示例),我暂时从这些页面中删除了iframe。

代码添加

auth_invite_launch.php

//CODE #1
header("Location:sign_in.php?location=".urlencode($_SERVER['REQUEST_URI']));
$redirect = NULL;
if ($_POST['location'] != '') {
    $redirect = $_POST['location'];
}

sign_in.php

//CODE #2
echo '<input type="hidden" name="location" value="';
if (isset($_GET['location'])) {
    echo htmlspecialchars($_GET['location']);
}
echo '" />';

invite_code - exec.php(此处提交sign_in.php)

//CODE #3
if ($redirect)) {
    header("Location:".$redirect);
}

预先存在的代码

createaccount.php

require_once('config/auth_invite_launch.php'); // session_start & checks if authorized
is_user_auth(); // Checks if authorized
is_user_logged(); // Checks if logged in 
get_logged_user_id();
if (is_user_logged() == TRUE) {
    $logged_in = true;
    $user_id = $_SESSION['SESS_USER_ID'];
}

auth_invite_launch.php

function is_user_auth(){
  // Checks if logged in to Member Account or has valid Invite Code
  if (isset($_SESSION['SESS_USER_ID']) || isset($_SESSION['TEMP_INVITE_ID'])){
      return true; 
  }
  //Replaced by CODE #1
  header("location: sign_in.php"); // Redirects if not authorized user
}
// Checks if logged in to member account 
function is_user_logged(){
 if ( isset($_SESSION['SESS_USER_ID']) ){
      return true; 
   }
      return false;
}
// Retrieves ID if logged in to member account, NULL otherwise
function get_logged_user_id(){
   if ( is_user_logged() === TRUE ){
      return $_SESSION['SESS_USER_ID'];
   }
       return null;
}

invite_code - exec.php(此处提交sign_in.php)

// PRECEDED BY statement to fetch matching invite codes from db
if ($stmt - > rowCount() == 1) {
    $invite = $stmt - > fetch();
    $_SESSION['TEMP_INVITE_ID'] = $invite['idinvite_codes'];
    $_SESSION['TEMP_INVITE_CODE'] = $invite['invitation_code'];
    $invite_code = "true";
    //CODE #3 Added here
} else {
    $invite_code = "false";
    header("location: index.php");
    exit();
}

1 个答案:

答案 0 :(得分:1)

评论中的最后一个问题相当广泛:如何在表单重定向循环中跟踪执行路径?我会试一试。

假设您的授权脚本有一个登录检测设备,那么如果用户没有登录,它将重定向到登录系统:

if (!isLoggedin())
{
    header('Location: /login.php?location=' . urlencode(getCurrentUrl()));
    exit();
}

因此,在您的登录表单中,您将需要一个POST操作,其中包含重定向位置的隐藏字段(看起来您在sign_in.php中有此操作):

<?php
// Handle post
if ($_POST)
{
    if (loginCorrect())
    {
        // Redirect to the redirect location
        // cleanUrl() should ensure the user input pertains to a
        // local script name, so it cannot be used as a spammer's
        // redirection device
        header('Location: ' . cleanUrl($_POST['redirect']));
        exit();
    }
}
?>
<form method="post">
    <!-- hidden field containing redirect location -->
    <!-- username/password fields -->
</form>

然后您希望URL到达重定向位置。这是四页(一个重复):

  • 向授权页面发出请求
  • 如果未登录
  • ,则重定向到登录页面
  • 发布到自我或登录页面处理程序
  • 重定向到最初请求的页面,假设凭据正确

每个都可以调试。纯粹主义者会说你应该使用xDebug和一个调试器(在你的IDE中控制),但echoexit都可以。只需将它们添加到上面四个页面的顶部,然后查看重定向位置(或其他变量)是否正确:

echo 1;
exit();

有时我会添加其中的一些内容,以了解控件在单个页面中的工作原理。版本控制在这里几乎是必不可少的,因为能够轻松删除它们很重要 - 您显然不希望部署包含调试语句的代码。

也值得在登录表单页面上使用View Source,以确保正确填充隐藏字段。