1

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

3 回答 3

0

尝试这个:

header("Location: http://site.com/index.php");
于 2012-05-21T17:36:13.043 回答
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
}

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

于 2012-05-22T10:18:56.920 回答
0

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

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

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

于 2012-05-22T10:06:28.070 回答