在浏览器访问一个网页时,服务器首先通过 HTTP 协议与浏览器建立通信。这个过程包括发送 HTTP 头部信息和随后的 HTML 内容。HTTP 头部信息不仅包含了网页的基本信息(如内容类型、字符集等),还决定了浏览器如何处理页面的显示、缓存、跳转等行为。
在 PHP 中,我们使用 header() 函数来发送 HTTP 头部。例如,以下代码会让浏览器重定向到一个新的页面:
<?php
header("Location: http://m66.net/newpage.php");
exit;
?>
当这段代码执行时,服务器会发送一个重定向头部(Location),然后浏览器会根据这个头部信息进行跳转。此时,PHP 脚本会停止执行(由于 exit()),所以后续的 HTML 内容不会输出。
在 PHP 中,HTTP 头部必须在任何 HTML 输出之前发送。这是因为 HTTP 头部信息是由服务器先发送的,而 HTML 内容则是随后的数据。如果你在 PHP 中先输出了 HTML 内容或任何其他字符,再调用 header() 函数,PHP 将会报错,提示“headers already sent”(头部已经发送)。
例如,下面的代码会出错:
<?php
echo "Hello World!"; // 输出了 HTML 内容
header("Location: http://m66.net/newpage.php"); // 尝试发送重定向头部
exit;
?>
这段代码执行时,会抛出一个警告,提示头部已经被发送。原因就是 echo 语句已经输出了 HTML 内容,导致 HTTP 头部无法再发送。
在 HTTP 协议中,头部信息必须在实际的页面内容(HTML、图片、CSS 等)之前发送。浏览器根据收到的头部信息来决定如何处理接收到的页面。举个例子,Location 头部指示浏览器应该进行重定向,而 Content-Type 则告诉浏览器当前页面的内容类型。
PHP 需要在输出 HTML 内容之前通过 header() 函数发送这些头部,因为一旦 HTML 开始被发送到浏览器,服务器就无法再更改 HTTP 头部。为了保证能够成功修改 HTTP 头部(比如进行重定向),你必须确保 header() 在任何输出之前被调用。
虽然 PHP 要求在输出任何 HTML 内容之前调用 header(),但是在某些情况下,输出缓冲(Output Buffering)可以帮助解决这一问题。输出缓冲允许 PHP 在实际发送 HTML 内容之前先将其存储在内存中,这样就可以在后续调用 header() 时不受已输出内容的影响。
使用输出缓冲的代码示例如下:
<?php
ob_start(); // 开启输出缓冲
echo "Hello World!"; // 仍然可以输出内容
header("Location: http://m66.net/newpage.php"); // 发送头部
exit;
?>
在上述代码中,ob_start() 函数启用了输出缓冲,这样即使在 echo 后输出了内容,PHP 也不会立刻将这些内容发送到浏览器,而是将它们存储在缓冲区中。这允许你后续调用 header() 函数来修改 HTTP 头部,而不会遇到“headers already sent”错误。
页面重定向: 使用 header("Location: URL") 来将用户重定向到另一个页面。
header("Location: http://m66.net/anotherpage.php");
exit;
设置内容类型: 使用 header("Content-Type: type") 来设置页面的内容类型,例如:
header("Content-Type: application/json");
echo json_encode($data);
控制缓存: 使用 header() 来设置缓存控制,指示浏览器是否应该缓存某个页面。
header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: 0");
PHP 的 header() 函数用于发送 HTTP 头部信息,它的调用顺序对页面的输出顺序至关重要。由于 HTTP 头部必须在 HTML 内容之前发送,因此调用 header() 时必须确保没有输出任何内容。为了解决这一问题,输出缓冲可以作为一种有效的解决方案。理解 header() 函数与页面输出顺序的关系,有助于避免因不正确的调用顺序而导致的错误和意外行为。
通过合理使用 header() 函数和输出缓冲,你可以确保 PHP 脚本按预期工作,避免遇到不必要的错误。