0

我有一个与此类似的问题,但略有不同。

我的结构是这样的:用户想要访问的页面类似于 displayData.php。这是他们最终应该回到的页面。此页面检查您是否已登录并且会话未过期,如下所示:

if ($_SESSION["loggedIn"] != "YES")
{
  header ("Location: ".$baseURL."timeout.php");
  exit();
}

在 timeout.php 上,我检查了引用者:

<?php
session_start();
$_SESSION['redirect'] = $_SERVER['HTTP_REFERER'];
$_SESSION["errorMessage"] = "Your session has timed out or<br>you have not logged in correctly.";
header ("Location: index.php");
exit();
?>

问题出现在用户提交登录表单和登录页面检查是否有推荐人之后。但是,我们已经确定他们拥有正确的登录信息。

if(isset($_SESSION['redirect'])){
    header ("Location: ".$_SESSION['redirect']);
}else{
    header ("Location: menu.php");
}

我认为从逻辑上讲,当超时页面将变量设置为 时$_SERVER['HTTP_REFERER'];,它会将其设置为重定向到 timeout.php 的页面,在本例中为 displayData.php。然而,似乎相反,它将它设置为 displayData.php 的引用者(可以是任何东西,但它不是我们想要发送用户的内容)。

这是 HTTP_REFERER 的预期效果,如果有标头重定向则不更新?如果是这样,那太糟糕了,我需要重写大约 80 个文件来更改登录/超时系统。我希望有一个更简单的方法。我们会在基于函数的系统中完成此操作,但我们目前正在尝试扩展遗留代码。

非常感谢。

编辑:

在这里稍微清楚一点。把它想象成一个文件夹,/admin/。displayData.php 是许多只能通过登录才能访问的文件之一(因此,当检测到他们未登录时,我们不知道他们试图访问的特定页面)。当会话到期时(或者如果根本没有会话),这些页面中的每一个都会重定向到 timeout.php,因此我希望 timeout.php 能够确定之前没有会话访问过的页面,然后保存该信息,以便以后可以将用户重定向回他们在我们网站上请求的原始页面。

我想通过 timeout.php 文件来做这件事的原因是因为有很多文件就像 displayData.php 一样,如果我不需要,我不想编辑每个文件来改进系统,暂且。

如果这还不够清楚,请告诉我。

4

1 回答 1

0

HTTP_REFERER 旨在纯粹提供信息,由浏览器而不是服务器设置。这意味着它可以是空白的或完全是其他东西。它也可以由用户操作。如果可能,最好不要依赖它。

为什么不直接$_SESSION['redirect']在页面重定向到会话检查脚本之前设置呢?就此而言,为什么要重定向?您可以在脚本中包含几乎未修改的 timeout.php,并使用该$_SERVER['PHP_SELF']变量来确定$_SESSION['redirect']应该设置的内容。

于 2011-05-05T22:00:51.350 回答