我知道对修改标头信息的函数(如 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。
我想知道为什么。
谢谢!