PHP输出缓冲和标头位置

时间:2012-05-21 17:28:41

标签: php authentication ms-access output-buffering

我们的一台服务器上有一个非常古老的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
}

3 个答案:

答案 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
}

注意:以上代码只是一个示例,请在使用前根据您的需要进行更改。