我遇到与this one类似的问题,但略有不同。
我的结构如下: 用户想要访问的页面类似于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一样,如果我不这样做,我不想编辑它们中的每一个来改进系统必须暂时。
如果仍然不够清楚,请告诉我。
答案 0 :(得分:0)
HTTP_REFERER旨在纯粹是信息性的,由浏览器而不是服务器设置。这意味着它可以是空白或完全不同的东西。它也可以由用户操纵。如果可能的话,最好不要依赖它。
为什么不在您重定向到会话检查脚本之前实际在页面上时设置$_SESSION['redirect']
?那么为什么要重定向呢?您可以在脚本中包含几乎未修改的timeout.php,并使用$_SERVER['PHP_SELF']
变量来确定应将$_SESSION['redirect']
设置为什么。