0

我知道对修改标头信息的函数(如 session_start() 和产生警告“无法修改标头”或“无法发送会话缓存限制器”的 header() 函数)以及原因和解决方案的限制,所有这些都可在此处获得:如何修复 PHP 中的“标头已发送”错误

我想知道的是,为什么当我收到这些错误时,它不在 php 标签或 HTML 输出的 START 之前的空白处?通常,错误发生在一大块 HTML 输出中间的某个地方,该输出发生在对标头函数的任何调用之前。

在这些情况下,在收到警告之前,标头函数实际上是在原始 HTML 输出之后起作用的。但是在某些时候,要么发生了一些变化,要么我添加了一些东西,然后我开始收到警告,这通常指向大量 HTML 输出之后的某个点。

这让我认为我输出的 HTML 通常会自动缓冲(ob_start() 解决问题)到一定程度,然后某些东西会导致输出。

我的 header.php 文件:

<!DOCTYPE html>

<html lang="en">
<?php
    header("Cache-Control: no-cache, must-revalidate");
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>    
    <head>
        <!-- style sheets and includes here -->
    </head>

    <?php

    session_start();
    //error_reporting(0);

    // some PHP code here for user checking / cookies

    ?>

    <body>
        <!-- some additional html here -->

    <?php include("resources/main-nav.php"); ?>

在一个单独的文件中:

<?php

include('pathto/header.php')


//This line works for a while and then stops, producing
// the "Warning: cannot modify headers" line

// The warning that this call produces names a line around 100
// inside the "main-nav.php" file

header('Location: index.php');

?>

在我看来,如果我要得到这个错误,它应该发生在我的 DOCTYPE 标记的 header.php 的开头......但是有相当多的 HTML,并且输出被记录为以 main- 开头导航.php。

我想知道为什么。

谢谢!

4

1 回答 1

2
<!DOCTYPE html>         <---this is output
                        <---this is output
<html lang="en">        <---this is output
<?php
    header("Cache-Control: no-cache, must-revalidate");

您收到“标头已发送”,因为您在尝试调用时已经完成了输出header()header()调用必须在代码的任何输出之前出现,例如

<?php
    header("Cache-Control: no-cache, must-revalidate");
?>
<!DOCTYPE html>         <---this is output
                        <---this is output
<html lang="en">        <---this is output

会工作

于 2013-09-20T15:54:57.340 回答