Php 登录后重定向回上一页时出现问题

Php 登录后重定向回上一页时出现问题,php,redirect,login,authorization,Php,Redirect,Login,Authorization,一旦用户成功完成以下两件事中的一件,我需要将用户重定向到他们来自的页面:1)输入邀请代码,或2)登录 我正在尝试应用发布的答案,但在花了几个小时试图让它工作失败后,我意识到是时候寻求帮助了 为了简化代码,我只包含了与选项1(邀请代码)相关的片段。此外,为了首先让它使用一个更简单的版本(并更紧密地复制给出的示例),我暂时从这些页面中删除了iframe 代码添加 auth_invite_launch.php sign_in.php 预先存在的代码 createaccount.php auth_inv

一旦用户成功完成以下两件事中的一件,我需要将用户重定向到他们来自的页面:1)输入邀请代码,或2)登录

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

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

代码添加

auth_invite_launch.php

sign_in.php

预先存在的代码

createaccount.php

auth_invite_launch.php

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


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

假设您的仅授权脚本具有登录检测设备,因此如果用户未登录,它将重定向到登录系统:

if (!isLoggedin())
{
    header('Location: /login.php?location=' . urlencode(getCurrentUrl()));
    exit();
}
因此,在登录表单中,您需要一个POST操作,其中包含一个隐藏的重定向位置字段(看起来您在
sign\u in.php
中有此字段):

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


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

我的第一个观察结果是,您有时在没有立即退出的情况下执行
位置
重定向(例如在
auth\u invite\u launch.php
)。PHP不知道location头应该终止脚本,因此它将愉快地继续运行,直到检测到远程端已断开连接。由于在发出报头和断开连接之间存在延迟(取决于网络连接的速度),在报头之后可能会执行看似随机的脚本量,这可能会导致一些非常棘手的错误。首先修复这个
:-)
@halfer Done:-)但是,正如我从你的帖子中推断的那样,这并没有完全修复它;-)不,我希望它能解决它!虽然这只是因为可能导致的错误看起来是非常随机的。好的,所以我们可能需要更详细的信息-您有两个操作,您希望将用户重定向回他们来自的位置,但这些操作不起作用。你能在这里放大“不工作”这个词吗?他们是否会重定向,但不会重定向到正确的位置?或者它们根本不重定向?我要做的是(确保所有代码都在版本控制中,这样您就可以轻松地删除调试更改)在策略位置添加一些
echo/exit
对以跟踪执行;这将阻止重定向正常工作,但这没关系-您希望看到运行的是什么代码。(目前还不完全清楚what中包含了什么,当然读者也无法得到调试,这是大多数人可能会如何处理这个问题的)。@halfer-目前它根本没有重定向:-(我的错;-)(告诉你我已经花了多少个小时试图修复这个问题)我不知道为什么我很难实现您漂亮的简单指令:(但好消息是,我能够通过使用原始代码(使用iframes)以另一种方式找出问题所在。)我知道这确实有效——这只是在用户登录后将其返回index.php,并要求他们再次单击所需的链接,因为即使我插入了新代码,它仍在做同样的事情,似乎问题在于我试图通过难以说@Chaya的方式传递所需的位置-我想知道iframes这件事是否让人困惑。所有东西都在同一个域上,对吗?指向不同域的iframes通常在会话中与应用程序的其余部分隔离开来。如果有重定向到
index.php
,那么听起来登录系统中有一个重定向功能,你没有考虑到(可能您错过了一个?)。在源代码中搜索
index.php
,看看您是否能找到它。当然,它可能认为这是用户希望重定向到的内容,在这种情况下,隐藏字段的录制可能有问题(此处查看源代码帮助)。如果我的代码混乱的大脑干扰了我更清晰地描述它,我很抱歉:-(路径起源于index.php,因此当我使用iframes index.php时,它在后台保持打开状态。我认为这将有助于缩小问题的范围,因为这样我知道它实际上贯穿了整个过程(包括在invite_code-exec.php上运行最终脚本后返回“$invite_code=“true”;”,但由于它没有传递要重定向到的新位置,因此返回到同一页面。Right@Chaya;如果
index.php
可以接受包含重定向的查询字符串,但实际上登录/重定向发生在
index.php
内的iframe中,则不会触及外部页面-iframe中的重定向是单独的。Pers通常,我会去掉iframe,除非它对你的设计很关键。在我看来,它们会导致应用程序脱节。
//CODE #2
echo '<input type="hidden" name="location" value="';
if (isset($_GET['location'])) {
    echo htmlspecialchars($_GET['location']);
}
echo '" />';
//CODE #3
if ($redirect)) {
    header("Location:".$redirect);
}
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'];
}
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;
}
// 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();
}
if (!isLoggedin())
{
    header('Location: /login.php?location=' . urlencode(getCurrentUrl()));
    exit();
}
<?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>
echo 1;
exit();