如何在PHP中重定向而不出现标题错误?

如何在PHP中重定向而不出现标题错误?,php,redirect,header,Php,Redirect,Header,如何在PHP中使用下面的设置重定向而不出现标题输出错误,我知道在设置标题之前无法将任何内容打印到浏览器中,我正在寻找解决方案,而不是解释为什么会发生 <?PHP // include header include ('header.inc.php'); // In my body section file if this is a page that requires a user be logged in then // I run a function validlogin($u

如何在PHP中使用下面的设置重定向而不出现标题输出错误,我知道在设置标题之前无法将任何内容打印到浏览器中,我正在寻找解决方案,而不是解释为什么会发生

<?PHP
// include header
include ('header.inc.php');



// In my body section file if this is a page that requires a user be logged in then
// I run a function validlogin($url-of-page-we-are-on); inside of that file
//the function is below, it outputs a redirect to login page if not logged in

// include body of page we want
include ('SOME-FILE-HERE.php');



// include footer
include ('footer.inc.php');



// here is the function that is in the body pages, it is only called on a page that we require a logged in user so there are hundreds of pages that do have this and a bunch that don't, it's on a page to page basis
function validlogin($url) {
    if ($_SESSION['auto_id'] == '') {
        $msg = 'Please login';
        $_SESSION['sess_login_msg'] = $msg;
        $_SESSION['backurl'] = $url;
        $temp = '';
        header("Location: /");
        exit();
    }
}
?>

我想使用php的header函数,而不是meta或javascript重定向


如果可能的话,维护需要登录或不需要登录的页面列表在这里也不是一个选项

在第一行使用ob_start(),即使在包含之前也是如此。因此,您可以随时设置标题。

只要在header()函数之前没有脚本输出,您就可以了。检查是否没有回音或空白。另外,将ob_start()放在开头也会有所帮助。有时会出现不可见的空白-将文档的格式更改为ANSI或Unicode可能会有所帮助


请注意(尽管我想您已经知道)页眉不会终止脚本,因此exit()是一个明确的要求。

footer.inc.php和SOME-FILE-HERE.php是否立即写入响应流?因为如果是这样,这将不起作用,因为在发送头之前您已经写了一些东西。

您需要缓冲输出,以便在第一次输出时不发送HTTP头。您可以通过启用隐式缓冲任何输出,也可以通过调用显式缓冲任何输出。但后者必须在第一次输出之前调用,因此理想情况下,在最初调用的脚本的第一行中。

如其他人所述,使用或-设置来缓冲输出。除此之外,从我的观点来看,在函数代码的中间输出内容不是一个好的实践,但这是另一个主题。
您可以在Google或中找到更多信息。

您不能这样做吗:

<?php
validlogin($url); // call the function here
include ('header.inc.php');
include ('SOME-FILE-HERE.php');
include ('footer.inc.php');
?>

或者,如果可能的话,将include文件放在每一个“SOME-FILE-HERE”类型的文件中,这样您就可以得到:

<?php
validlogin($url); // call the function here
include ('header.inc.php');
?>

<h1>Page heading</h1>
...page content etc...

<?php
include ('footer.inc.php');
?>

页眉
…页面内容等。。。

使用
{echo';}

有输出,在我的示例中,在我知道是否在需要登录的页面上之前,我的整个头文件都被输出了!当然,validlogin()函数应该在包含标题之前调用吗?正如我也提到的,这不可能,不是所有的页面都需要登录,而且页面都是动态构建的,现在你明白了问题=)啊,好吧,这变得更具挑战性:)有一个函数,而且我一辈子都记不住了,这将迫使处理器缓存响应,直到您发出发送所有响应的命令,我将尝试为您查找,因为这可能会解决您的问题…jasondavis,Gumbo的答案是正确的,尽管确保在脚本末尾调用ob_end_flush()来发送缓冲响应流。基本上,ob_start()//您的所有代码,包括任何include ob_end_fush();ob_start()确实解决了这个问题,但我讨厌使用它,我想我需要更好地理解它是如何工作的,它需要将整个页面保存到内存中,而不仅仅是正确地显示它?不是直接显示。php始终使用outputbuffer。但它的工作原理不同。正常的缓冲区可以随时刷新到浏览器。使用outputbuffering只有一个缺点,你不能使用flush(),仅此而已。对不起,我对同一个问题有另一个问题,我不知道我在这一个问题上,不管怎么说,这就是我早期做这件事的方式,而且效果很好