PHP 错误:无法修改标头信息 – 标头已发送[重复]

问题描述 投票:0回答:5

所以我的页面上有这个输出..不明白为什么我会弹出它。不过我是 php 新手,所以也许这很容易修复

-我有一个 header.php 文件,其中包含所有重要信息,以及页面的横幅。每个页面都包含此 header.php。

-我让它检查会话值以确保用户被允许进入某个页面。如果用户不被允许在那里,我会将他们踢回登录页面

这就是错误出现的地方。这就是我所拥有的:

include_once ("header.php");
                
if ($_SESSION['uid']!='programmer')
{                        
header('Location: index.php');
echo 'you cannot be here';
exit;
}   

它重定向到的索引也有标头。那么这些多个标头引用是否会给我带来这个错误?我看不出有其他方法可以做到这一点,这让我发疯!

php header
5个回答
36
投票

一旦文本输出到浏览器,您就无法使用

header()
。由于您的
header.php
可能包含输出 HTML,因此无法使用
header()

您可以通过多种方式解决此问题:

  • 将 if 语句移至标题包含上方(这不起作用,因为您在注释中指出
    header.php
    设置 uid 会话和其他重要内容)。
  • 在脚本顶部调用
    ob_start()
    来缓冲输出。

6
投票

如果 header.php 文件“有横幅”,那么它可能正在向页面输出一些 HTML 内容。

输出内容后无法发出 HTTP 标头。


6
投票

发送任何其他内容后无法发送任何标头。一个很可能的罪魁祸首是 header.php 中结束

?>
标记后的额外空格。在任何纯脚本 php 文件中完全省略结束标记通常是一个好习惯。

您的错误应该准确地告诉您哪一行(以及哪个文件)正在发送输出。


2
投票

对于重定向函数,我遇到了类似的错误(似乎也是无中生有),该错误曾经如下:

function Redirect($url) {
        flush(); // Flush the buffer
        header("Location: $url"); // Rewrite the header
        die;
    }

显然,您还需要添加

ob_flush();
来完全清除旧标头。新功能是:

function Redirect($url) {
        flush(); // Flush the buffer
        ob_flush();
        header("Location: $url"); // Rewrite the header
        die;
    }

希望这可以帮助遇到此问题的其他人!


1
投票

好吧,所以它已经修复了......不过不知道如何,也许有人可以解释为什么这会突然起作用。

这是我的代码:

include_once ("header.php");

if ($_SESSION['uid']!='programmer') {  
    if(isset($_SESSION['uid'])) {
        echo $_SESSION['uid'];
    }                           

    header('Location: index.php');
    exit;
}

让我再说一遍,现在一切正常了! PHP...你为什么现在工作?

© www.soinside.com 2019 - 2024. All rights reserved.