0

我在运行Windows 10 家庭单语言版的机器上使用PHP 7.1.11 。

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

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

  1. Google Chrome(版本 62.0.3202.94(官方构建)(64 位))
  2. Firefox Quantum(57.0.1(64 位))
  3. 歌剧(版本:49.0.2725.47)
  4. 微软边缘 41.16299.15.0

我知道功能的细节header()以及它是如何工作的。

但是以下程序在上述所有四种网络浏览器上的行为确实很奇怪。即使在将输出发送到客户端之后, 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>

我期待收到警告“无法修改标头信息 - 标头已发送”,但令人惊讶的是它正在将我重定向到 URL http://www.espncricinfo.com/

为什么?

4

1 回答 1

1

如果您以某种方式使用输出缓冲——要么是手动的,要么是因为你的 PHP 被配置为自动执行此操作——你仍然可以添加头文件,只要初始缓冲区没有被刷新。

输出缓冲的作用正如其名称所暗示的那样:将输出放在缓冲区中以便稍后发送,而不是立即输出数据。因此,只要没有发送HTTP 响应消息的正文数据,您仍然可以发送标头数据。


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

  1. 检查 php.ini 配置文件并搜索字符串output_buffering
  2. var_dump( ini_get( 'output_buffering' ) );
  3. phpinfo();(转储整个配置)并搜索字符串output_buffering

如果启用了输出缓冲,则该值将以字节为单位的缓冲区大小(如果配置为这样),或"On"true,或类似的效果。

于 2017-12-04T05:27:52.473 回答