为什么我没有收到'警告:无法修改标题信息 - 已经发送的标题'正如我预期的那样?

时间:2017-12-04 05:05:59

标签: php http http-headers webserver header-fields

我在 Windows 10家庭单一语言版本上运行的计算机上使用 PHP 7.1.11

我在我的机器上使用 XAMPP 服务器。

我在这台机器上使用以下浏览器:

  1. Google Chrome(版本62.0.3202.94(官方版)(64位))
  2. Firefox Quantum(57.0.1(64位))
  3. Opera(版本:49.0.2725.47)
  4. Microsoft Edge 41.16299.15.0
  5. 我知道header()函数的详细信息及其工作原理。

    但是,以下程序在所有上述四种Web浏览器中表现得非常奇怪。即使在向客户端发送输出之后,header()函数也正常工作。

    这怎么可能?

    下面是我的代码(它被重定向到我提到的URL):

        <!DOCTYPE html>
        <html>
          <body>
            <p>Welcome to my website!</p><br /> 
            <?php
              ini_set('display_errors', 1);
              ini_set('display_startup_errors', 1);
              error_reporting(E_ALL); 
              if($test) { 
                echo 'Welcome to my website<br />You\'re in!'; 
              } else { 
                header('Location: http://www.espncricinfo.com'); 
              } 
            ?>
          </body>
        </html>
    

    我希望得到警告'无法修改标题信息 - 标题已经由'发送,但令人惊讶的是它会将我重定向到网址http://www.espncricinfo.com/

    为什么?

1 个答案:

答案 0 :(得分:1)

如果你以某种方式使用output buffering - manually,或者因为your PHP is configured to automatically这样做 - 你仍然可以添加标题,只要初始缓冲区没有被刷新。

输出缓冲的作用是名称提示:将输出放在缓冲区中以便稍后发送,而不是立即输出数据。因此,只要没有发送HTTP response message的正文数据,您仍然可以发送标题数据。

要检查PHP是否配置为自动缓冲输出,您可以执行以下操作之一:

  1. 检查php.ini配置文件并搜索字符串output_buffering
  2. var_dump( ini_get( 'output_buffering' ) );
  3. phpinfo();(转储整个配置)并搜索字符串output_buffering
  4. 如果启用了输出缓冲,则该值将是缓冲区大小(以字节为单位)(如果已配置),或"On"true,或类似的效果。