我们的一台服务器上有一个非常古老的php身份验证脚本,如下所示:
ob_start();
$log = new Auth();
// returns true
$checkSession = $log->checkLog();
if(!$checkSession){
header("Location: ../index.php");
exit();
}else{
include "content/".$_GET["content"].".php";
}
$content = ob_get_contents();
ob_end_clean();
include "../".WEBROOT_TEMPLATE_FILE;
它始终顺利运行(经过身份验证的用户可以访问该页面,未经身份验证的用户被重定向到主页)......直到今天!
出于一些完全不知情的原因,当用户尝试从访问2000数据库生成的链接到达其中一个服务器页面时,它们总是被重定向到index.php。
奇怪的是,将URL直接粘贴到浏览器中时可以正常工作。 url完全相同,$ _SERVER变量在两种情况下也是相同的。我甚至检查了相同的HTTP标头。
此外,如果我评论重定向,它确实有效:
if(!$checkSession){
//header("Location: ../index.php");
//exit();
}else{
// that part is executed
include "content/".$_GET["content"].".php";
}
有人在这里遇到同样的问题,但遗憾的是没有收到任何有效的答案:PHP if-statement ignored when header(Location: xxx) is inside
有什么想法吗?
先谢谢你的帮助,
修改:找到解决方案
由于某种原因,apache服务器不喜欢访问2000数据库生成的http请求,并发布了一个带有修改标头的新请求(特别是http接受)......可悲的是,第一个请求没有初始化任何会话...因此重定向到index.php。
对我来说,(丑陋但有效)的解决方案是:
if($_SERVER['HTTP_ACCEPT']!="*/*"){
// Do your stuff
}
答案 0 :(得分:0)
试试这个:
header("Location: http://site.com/index.php");
答案 1 :(得分:0)
正如@MonkeyMonkey所说,它很可能与已发送标题/ cookie的事实有关,当脚本到达会话身份验证并重定向时,它无法重新发送。
如果您将error_reporting设置为E_ALL,则会产生“警告:标头已发送”。
现在关于哪里输出开始,精确定位将非常棘手。事实上,在ob_start之前包含的任何文件都可以在结尾处有一个空格/制表符/换行符(在结束?> 之后)。
答案 2 :(得分:0)
在ob_start()
之后添加此内容:
if(!isset($_SESSION)) {
session_start();
}
之后,检查$_SESSION[]
中的任何变量是否已设置且具有任何值:
if(!isset($_SESSION['username']) || $_SESSION['username'] == "") {
header("Location: ../index.php"); //redirect unauthorized users
exit();
}
else {
// your code
}
注意:以上代码只是一个示例,请在使用前根据您的需要进行更改。