【问题标题】:PHP output buffering and header locationPHP 输出缓冲和标头位置
【发布时间】:2012-05-21 17:28:41
【问题描述】:

在我们的一台服务器上有一个相当古老的 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;

它一直运行顺利(经过身份验证的用户能够访问该页面,未经身份验证的用户被重定向到主页)......直到今天!

由于某些完全未知的原因,当用户尝试从 access 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 服务器不喜欢由 access 2000 数据库生成的 http 请求,并发出一个带有修改头的新请求(尤其是 http 接受)...遗憾的是,第一个请求没有初始化任何会话...因此重定向到 index.php。

所以(丑陋但有效的)解决方案对我来说是:

if($_SERVER['HTTP_ACCEPT']!="*/*"){
// Do your stuff
}

【问题讨论】:

  • 我们无法解决您的编码问题,我们不知道实现。启用错误报告/显示错误并开始调试。我没有其他办法......

标签: php authentication ms-access output-buffering


【解决方案1】:

试试这个:

header("Location: http://site.com/index.php");

【讨论】:

  • 这并没有改变任何事情。我不明白这与我的问题有什么关系,但无论如何谢谢。
【解决方案2】:

正如@MonkeyMonkey 所说,这很可能与已经发送标头/cookies 的事实有关,并且当脚本到达会话身份验证并重定向时,它无法重新发送它们。

如果您将 error_reporting 设置为 E_ALL,这应该会产生“警告:标头已发送”。

现在关于从哪里输出开始,这将是相当棘手的精确定位。实际上,包含在 ob_start 之前的任何文件都可以在末尾有一个空格/制表符/换行符(在结尾 ?> 之后)。

【讨论】:

    【解决方案3】:

    在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
    }
    

    注意:以上代码仅为示例,使用前请根据需要更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 2011-03-07
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多