【问题标题】:'php headers already sent' no longer an issue?'php headers already sent' 不再是问题?
【发布时间】:2014-02-04 07:54:06
【问题描述】:

在 php 手册 (http://php.net/manual/en/function.header.php) 中,我发现以下关于 http 标头的内容:

报价 请记住,header() 必须在发送任何实际输出之前调用,无论是通过普通 HTML 标记、文件中的空白行还是从 PHP 发送。使用 include 或 require 函数或其他文件访问函数读取代码并在调用 header() 之前输出空格或空行是一个非常常见的错误。使用单个 PHP/HTML 文件时也存在同样的问题。

<html>
<?php
/* This will give an error. Note the output
 * above, which is before the header() call */
header('Location: http://www.example.com/');
exit;
?>

结束报价

我现在尝试了这个(研究 HTTP 协议),发现这似乎不再是问题了;我想知道发生了什么变化:php 处理解析网页的方式是否发生了变化?我尝试了几种浏览器(Chrome、IE10、IE7)和操作系统(Windows 8.1、XP),但它们似乎都没有问题了(请参阅 informaticaschool.net76.net/httpdemo3.php 以获取包含上述内容的页面代码示例,不报错。

有关在该服务器上运行的 php 版本的详细信息(我也尝试了不同的 apache 服务器),请参阅 informaticaschool.net76.net/phpinfo.php。

我承认问为什么没有发生错误有点奇怪,但正如我所指出的那样,我正在研究 http 的工作原理。现在查看 Wireshark 跟踪以找出在这种情况下到底发生了什么,我以前知道这是一个问题,我现在惊讶地发现没有出现错误(并且在 php 手册中没有找到解释)。

【问题讨论】:

  • 不是浏览器问题,而是服务器问题。尝试几个浏览器是没有用的。
  • 您是否忽略了错误? ini_set('display_errors',1); ini_set('display_startup_errors',1); error_reporting(-1);
  • @DamianKrawczyk 也许他做到了,但他的例子很有效。
  • @Damian 这也是我的想法。但是然后重定向应该失败,不是吗?示例页面重定向到 example.com
  • 看看这个link

标签: php html http-headers


【解决方案1】:

该服务器已打开output_buffering,因此所有输出都被缓冲并保存,即使您已经产生了输出,您也可以将标头发送到 Web 服务器。请参阅the canonical answer about this issue部分“但它在另一台服务器上工作!?”

【讨论】:

    【解决方案2】:

    您必须在发送输出缓冲区之前发送标头。

    或者你可以使用函数ob_startob_end_flush来保存输出缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      相关资源
      最近更新 更多