header

(PHP 4, PHP 5, PHP 7, PHP 8)

header发送原始 HTTP 头

描述

header(string $header, bool $replace = true, int $response_code = 0): void

header() 用于发送原始 HTTP 头。有关 HTTP 头的更多信息,请参见 » HTTP/1.1 规范

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

<html>
<?php
/* 这将导致错误。注意上面的输出,它在 header() 调用之前 */
header('Location: http://www.example.com/');
exit;
?>

参数

header

头字符串。

有两个特殊情况的标题调用。第一个是标题以字符串 "HTTP/"(不区分大小写)开头,这将用于确定要发送的 HTTP 状态代码。例如,如果您已将 Apache 配置为使用 PHP 脚本处理缺少文件的请求(使用 ErrorDocument 指令),您可能希望确保您的脚本生成正确的状态代码。

<?php
// 此示例说明了 "HTTP/" 特殊情况
// 在典型用例中,更好的替代方法包括:
// 1. header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
// (为了覆盖仍使用 HTTP/1.0 的客户端的 http 状态消息)
// 2. http_response_code(404); (为了使用默认消息)
header("HTTP/1.1 404 Not Found");
?>

第二个特殊情况是 "Location:" 标题。它不仅将此标题发送回浏览器,而且还返回一个 REDIRECT (302) 状态代码到浏览器,除非已经设置了 2013xx 状态代码。

<?php
header
("Location: http://www.example.com/"); /* 重定向浏览器 */

/* 确保重定向时不会执行下面的代码。 */
exit;
?>

replace

可选的 replace 参数指示标题是否应该替换先前的类似标题,还是添加第二个相同类型的标题。默认情况下,它将替换,但如果您传递 false 作为第二个参数,您可以强制多个相同类型的标题。例如

<?php
header
('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', false);
?>

response_code

强制 HTTP 响应代码为指定的值。请注意,此参数仅在 header 不为空时才有效。

返回值

不返回值。

错误/异常

如果无法调度标题发送,header() 会发出 E_WARNING 级别的错误。

示例

示例 #1 下载对话框

如果您希望用户被提示保存要发送的数据,例如生成的 PDF 文件,您可以使用 » Content-Disposition 标题来提供建议的文件名,并强制浏览器显示保存对话框。

<?php
// 我们将输出一个 PDF
header('Content-Type: application/pdf');

// 它将被命名为 downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// PDF 来源在 original.pdf 中
readfile('original.pdf');
?>

示例 #2 缓存指令

PHP 脚本通常生成动态内容,这些内容不能被客户端浏览器或服务器和客户端浏览器之间的任何代理缓存所缓存。许多代理和客户端可以通过以下方式强制禁用缓存

<?php
header
("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // 过去的日期
?>

注意:

您可能会发现即使您没有输出上面所有的标题,您的页面也没有被缓存。用户可以为他们的浏览器设置许多选项,这些选项会更改其默认的缓存行为。通过发送上面的标题,您应该覆盖可能导致脚本的输出被缓存的任何设置。

此外,session_cache_limiter()session.cache_limiter 配置设置可以在使用会话时自动生成正确的与缓存相关的标题。

示例 #3 设置 Cookie

setcookie() 提供了一种方便的方法来设置 Cookie。要设置包含 setcookie() 不支持的属性的 Cookie,可以使用 header()

例如,以下设置了一个包含 Partitioned 属性的 Cookie。

<?php
header
('Set-Cookie: name=value; Secure; Path=/; SameSite=None; Partitioned;');
?>

注释

注意:

仅当使用支持它们的 SAPI 时,标题才可访问和输出。

注意:

您可以使用输出缓冲来解决这个问题,所有输出到浏览器的输出会在服务器中被缓冲,直到您发送它。您可以通过在脚本中调用 ob_start()ob_end_flush(),或在您的 php.ini 或服务器配置文件中设置 output_buffering 配置指令来做到这一点。

注意:

HTTP 状态标题行将始终是第一个发送到客户端的标题,无论实际的 header() 调用是否为第一个。状态可以在任何时候通过使用新状态行调用 header() 来覆盖,除非 HTTP 标题已发送。

注意:

大多数现代客户端接受作为 » Location: 参数的相对 URI,但一些较旧的客户端需要包含方案、主机名和绝对路径的绝对 URI。您通常可以使用 $_SERVER['HTTP_HOST']$_SERVER['PHP_SELF']dirname() 来从相对 URI 自己创建一个绝对 URI。

<?php
/* 重定向到当前目录中请求的另一个页面 */
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = 'mypage.php';
header("Location: http://$host$uri/$extra");
exit;
?>

注意:

即使启用了session.use_trans_sid,会话 ID 也不会通过 Location 标头传递。必须使用 **SID** 常量手动传递。

另请参阅

添加笔记

用户贡献笔记 33 条笔记

mjt at jpeto dot net
15 年前
我强烈建议你使用

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");

而不是

header("HTTP/1.1 404 Not Found");

我在 Apache/2.0.59 (Unix) 上遇到了很大的麻烦,它使用 HTTP/1.0 响应,而我(意外地)添加了 "HTTP/1.1 200 Ok" 标头。

大多数页面显示正确,但在其中一些页面上,apache 添加了奇怪的内容。

页面顶部(在我任何 php 脚本输出之前)的 4 位十六进制代码,似乎是一种校验和,因为它会因页面和浏览器而异。(对于相同的页面和浏览器,代码相同)

页面底部(在我 php 脚本完整输出之后)的 "0"

我花了相当长的时间才找出 HTTP 标头中的错误协议。
Marcel G
14 年前
这个问题在网上被问过很多次,但 php.net 上的文档中找不到答案...

如果你想重定向用户并告诉他他将被重定向,例如 "您将在大约 5 秒后被重定向。如果没有,请点击这里。",你不能使用 header( 'Location: ...' ),因为你不能在标头发送之前发送任何输出。

所以,你必须使用 HTML 元刷新,或者使用以下方法

<?php
header
( "refresh:5;url=wherever.php" );
echo
'您将在大约 5 秒后被重定向。如果没有,请点击 <a href="wherever.php">这里</a>.';
?>

希望对某些人有所帮助
Dylan at WeDefy dot com
16 年前
使用 header() 中的 $http_response_code 参数可以快速地将重定向设为永久或临时。

<?php
// 301 永久移动
header("Location: /foo.php",TRUE,301);

// 302 已找到
header("Location: /foo.php",TRUE,302);
header("Location: /foo.php");

// 303 查看其他
header("Location: /foo.php",TRUE,303);

// 307 临时重定向
header("Location: /foo.php",TRUE,307);
?>

HTTP 状态代码会改变浏览器和机器人处理重定向的方式,所以如果你使用 header(Location:),最好同时设置状态代码。浏览器通常会每次都重新请求 307 页面,为 302 页面缓存会话,并为 301 页面缓存更长时间,甚至无限期缓存。搜索引擎通常会将 "页面排名" 转移到 301 重定向的新位置,但不会转移到 302、303 或 307。如果没有指定状态代码,header('Location:') 默认设置为 302。
mandor at mandor dot net
18 年前
当使用 PHP 输出图像时,它不会被客户端缓存,因此如果你不希望他们在每次重新加载页面时都下载图像,你需要模拟 HTTP 协议的一部分。

以下是方法

<?php

// 测试图像。
$fn = '/test/foo.png';

// 获取客户端发送的标头。
$headers = apache_request_headers();

// 检查客户端是否正在验证其缓存以及它是否是最新的。
if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == filemtime($fn))) {
// 客户端的缓存是最新的,因此我们只响应 '304 未修改'。
header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 304);
} else {
// 图像未缓存或缓存已过期,我们响应 '200 OK' 并输出图像。
header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 200);
header('Content-Length: '.filesize($fn));
header('Content-Type: image/png');
print
file_get_contents($fn);
}

?>

这样 foo.png 就可以被客户端正确缓存,你就可以节省带宽。:)
Emmanuel Chazard
1 年前
如果你使用 header() 来允许用户下载文件,那么检查脚本本身的编码非常重要。你的脚本应该使用 UTF-8 编码,但绝对不能使用 UTF-8-BOM!BOM 的存在会改变用户接收到的文件。以下脚本

<?php

$content
= file_get_contents('test_download.png') ;
$name = 'test.png' ;
$size = strlen($content) ;

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Cache-Control: no-cache, must-revalidate');
header('Expires: 0');
header('Content-Disposition: attachment; filename="'.$name.'"');
header('Content-Length: ' . $size);
header('Pragma: public');

echo
$content ;

?>

无论 test_download.png 的编码如何,当此 PHP 脚本使用 UTF-8-BOM 编码时,用户接收到的内容都会不同
- 在文件的开头添加了一个 ZWNBSP 字节 (U+FEFF)
- 文件内容被截断!!!
如果它是一个二进制文件(例如图像、专有格式),那么该文件将无法读取。
php at ober-mail dot de
4 年前
从 PHP 5.4 开始,可以使用 `http_​response_​code()` 函数来设置响应代码,而不是使用 `header()` 函数,后者需要同时设置正确的协议版本(这可能会导致问题,如其他评论中所见)。
bebertjean at yahoo dot fr
15 年前
如果使用 'header' 函数下载文件,尤其是如果你将文件名作为变量传递,请记住将文件名用双引号括起来,否则一旦文件名中包含空格,就会在 Firefox 中出现问题。

所以,你应该这样写,而不是

<?php
header
("Content-Disposition: attachment; filename=" . basename($filename));
?>

你应该这样写

<?php
header
("Content-Disposition: attachment; filename=\"" . basename($filename) . "\"");
?>

如果您没有这样做,当用户点击名为“Example file with spaces.txt”的文件链接时,Firefox 的“另存为”对话框将显示其名称为“Example”,并且没有扩展名。

有关更多信息,请参阅名为“Filenames_with_spaces_are_truncated_upon_download”的页面,地址为
http://kb.mozillazine.org/。(抱歉,网站不允许我发布如此长的链接...)
David Spector
3 年前
请注意,无论是 PHP、浏览器还是 Web 开发工具,都没有针对 header 命令进行错误检查。

如果您使用类似“header('text/javascript');”来设置 PHP 响应文本的 MIME 类型(例如,用于回显或包含的数据),您将遇到未诊断的错误。

正确的 MIME 设置函数是“header('Content-type: text/javascript');”。
yjf_victor
8 年前
根据 RFC 6226 (https://tools.ietf.org/html/rfc6266),发送带有编码的 Content-Disposition Header 的唯一方法是

Content-Disposition: attachment;
filename*= UTF-8''%e2%82%ac%20rates

为了向后兼容,应发送

Content-Disposition: attachment;
filename="EURO rates";
filename*=utf-8''%e2%82%ac%20rates

因此,我们应该使用

<?php
$filename
= '中文文件名.exe'; // 中文文件名

$contentDispositionField = 'Content-Disposition: attachment; '
. sprintf('filename="%s"; ', rawurlencode($filename))
.
sprintf("filename*=utf-8''%s", rawurlencode($filename));

header('Content-Type: application/octet-stream');

header($contentDispositionField);

readfile('file_to_download.exe');
?>

我已经在 IE6-10、firefox 和 Chrome 中测试了代码。
sk89q
15 年前
您可以使用 HTTP 的 etags 和最后修改日期来确保您没有向浏览器发送它已经缓存的数据。

<?php
$last_modified_time
= filemtime($file);
$etag = md5_file($file);

header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
header("Etag: $etag");

if (@
strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time ||
trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
header("HTTP/1.1 304 Not Modified");
exit;
}
?>
nospam at nospam dot com
8 年前
<?php

// 使用
header('Location: /target.php', true, $code) 将用户转发到另一个页面时的响应代码行为:

$code = 301;
// 旧页面已被“永久移动”,任何未来的请求都应发送到目标页面。PageRank 可能被转移。

$code = 302; (默认)
// “临时重定向,因此仅在 Cache-Control 或 Expires 标头字段指示的情况下才缓存页面”。

$code = 303;
// “此方法主要用于允许 POST 激活的脚本的输出将用户代理重定向到选定的资源。新的 URI 不是对原始请求资源的替代引用,并且不会被缓存”。

$code = 307;
// 注意,在使用 POST 提交表单后使用此方法时,它会将已提交的值传递到下一页,例如,如果 target.php 包含一个表单处理脚本,它将再次处理提交的信息!

// 换句话说,如果永久,使用 301;如果临时,使用 302;如果提交表单的结果页面,使用 303。
// 如果表单处理脚本已移动,也许可以使用 307。

?>
tim at sharpwebdevelopment dot com
6 年前
header 调用可能会误导 PHP 新手。
当提到“header 调用”时,它指的是文件的左上角位置,而不是“header()”函数本身。
“<?php”打开标签必须放在任何其他内容之前,即使是空格。
David
6 年前
似乎说明 URI 必须是绝对路径的说明已经过时。在 https://en.wikipedia.org/wiki/HTTP_location 上找到

«HTTP 1.1 规范的过时版本 (IETF RFC 2616) 要求重定向使用完整的绝对 URI。[2] IETF HTTP 工作组发现,大多数流行的网络浏览器都容忍传递相对 URL[3],因此,更新的 HTTP 1.1 规范 (IETF RFC 7231) 放宽了原始约束,允许在 Location 标头中使用相对 URL。»
ben at indietorrent dot org
12 年前
请注意,如果包含以下任何标头,通过加密连接 (SSL/TLS) 向用户代理(浏览器)发送二进制文件将在 IE(Internet Explorer)版本 5、6、7 和 8 中失败

Cache-control:no-store
Cache-control:no-cache

参见:http://support.microsoft.com/kb/323308

解决方法:不要发送这些标头。

此外,请注意,IE 版本 5、6、7 和 8 会对已经压缩的文件进行双重压缩,并且不会正确地反转此过程,因此 ZIP 文件等在下载时会损坏。

解决方法:为这些特定版本的 IE 禁用压缩(超出 text/html),例如,使用 Apache 的“BrowserMatch”指令。以下示例在所有版本的 IE 中禁用压缩

BrowserMatch ".*MSIE.*" gzip-only-text/html
jp at webgraphe dot com
20 年前
在以下语句之前调用 session_write_close()

<?php
header
("Location: URL");
exit();
?>

如果要确保在继续重定向之前更新会话,建议这样做。

我们遇到了一种情况,重定向访问的脚本没有正确加载会话,因为前面的脚本没有时间更新它(我们使用了数据库处理程序)。

JP。
shutout2730 at yahoo dot com
15 年前
重要的是要注意,标头实际上是在第一个字节输出到浏览器时发送的。如果您在脚本中替换标头,这意味着 echo/print 语句和输出缓冲区的放置可能会影响实际发送的标头。在重定向的情况下,如果您忘记在发送标头后终止脚本,添加缓冲区或发送字符可能会更改用户被发送到的页面。

这将重定向到 2.html,因为第二个标头替换了第一个。

<?php
header
("location: 1.html");
header("location: 2.html"); // 替换 1.html
?>

这将重定向到 1.html,因为标头在 echo 发生后立即发送。您也不会看到任何“标头已发送”错误,因为浏览器在显示错误之前会遵循重定向。

<?php
header
("location: 1.html");
echo
"send data";
header("location: 2.html"); // 1.html 已发送
?>

将前面的示例包装在输出缓冲区中实际上会改变脚本的行为!这是因为标头不会在输出缓冲区刷新之前发送。

<?php
ob_start
();
header("location: 1.html");
echo
"send data";
header("location: 2.html"); // 替换 1.html
ob_end_flush(); // 现在发送标头
?>
chris at ocproducts dot com
7 年前
请注意,'session_start' 可能会覆盖您自定义的缓存标头。
为了解决这个问题,您需要调用

session_cache_limiter('');

...在您设置自定义缓存标头之后。它将告诉 PHP 会话代码不要进行任何它自己的缓存标头更改。
Refugnic
14 年前
我的文件处于压缩状态 (bz2)。当用户点击链接时,我希望他们获得文件的未压缩版本。

解压缩文件后,我遇到了一个问题,即即使我告诉对话框“始终对这种文件类型执行此操作”,下载对话框也会始终弹出。

正如我发现的,问题出在 header 指令 'Content-Disposition' 中,即 'attachment' 指令。

如果您希望浏览器模拟对文件的普通链接,可以将 'attachment' 更改为 'inline' 或完全省略它,这样就可以了。

我花了一段时间才弄明白,希望这对遇到同样问题的其他人有所帮助。
dev at omikrosys dot com
14 年前
只是通知大家,不要混淆 Content-Transfer-Encoding 和 Content-Encoding。

Content-Transfer-Encoding 指定用于在 HTTP 协议中传输数据的编码,例如原始二进制或 base64。(二进制比 base64 更紧凑。base64 有 33% 的开销)。
例如使用:- header('Content-Transfer-Encoding: binary');

Content-Encoding 用于将 gzip 压缩等应用于内容/数据。
例如使用:- header('Content-Encoding: gzip');
匿名
15 年前
我只是想补充一下,因为我在这里看到了很多格式错误的头部。

1. 所有使用的头部都将第一个字母大写,所以您必须遵循此规则。例如

Location,而不是location
Content-Type,而不是content-type,也不是CONTENT-TYPE

2. 然后必须有冒号和空格,例如

正确:header("Content-Type: text/plain");
错误:header("Content-Type:text/plain");

3. Location 头部必须是包含方案、域名、端口、路径等的绝对 URI。

正确:header("Location: http://www.example.com/something.php?a=1");

4. 不允许使用相对 URI

错误:Location: /something.php?a=1
错误:Location: ?a=1

这将使代理服务器和 HTTP 客户端更愉快。
razvan_bc at yahoo dot com
6 年前
<?php
/* 这将导致错误。注意上面的输出
* 在 header() 调用之前 */
header('Location: http://www.example.com/');
exit;
?>

这个例子很好,但是当你使用 "exit" 时,解析器仍然会继续工作,以决定 "exit" 的操作应该做什么(因为如果你查看手册,exit 在其他情况下也能工作)。
所以我的意思是:你应该使用
<?php

header
('Location: http://www.example.com/');
die();

?>
因为 die 函数的作用只是停止脚本,没有其他地方可以进行解释,并且您选择中断脚本操作的范围很快就会完成!!!

在其他示例中有很多情况,以及在编写 PHP 框架时,对脚本的小部分做出正确选择会产生差异!

感谢 Rasmus Lerdorf 和他的团队,他们解决了 PHP 异常功能的部分问题,PHP 7 rulez !!!!!
scott at lucentminds dot com
14 年前
如果您想删除一个头部,并防止它作为头部响应的一部分发送,只需在头部名称后面提供一个空值作为头部值。例如...

默认情况下,PHP 始终返回以下头部

"Content-Type: text/html"

您的整个头部响应将如下所示

HTTP/1.1 200 OK
Server: Apache/2.2.11 (Unix)
X-Powered-By: PHP/5.2.8
Date: Fri, 16 Oct 2009 23:05:07 GMT
Content-Type: text/html; charset=UTF-8
Connection: close

如果您使用没有值的头部名称调用,如下所示...

<?php

header
( 'Content-Type:' );

?>

您的头部现在将如下所示

HTTP/1.1 200 OK
Server: Apache/2.2.11 (Unix)
X-Powered-By: PHP/5.2.8
Date: Fri, 16 Oct 2009 23:05:07 GMT
Connection: close
mzheng[no-spam-thx] at ariba dot com
15 年前
对于大型文件(100+ MB),我发现尽快刷新文件内容至关重要,否则下载对话框会在很长时间后才会显示,或者根本不会显示。

<?php
header
("Content-Disposition: attachment; filename=" . urlencode($file));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize($file));
flush(); // 这并不重要

$fp = fopen($file, "r");
while (!
feof($fp))
{
echo
fread($fp, 65536);
flush(); // 这对于大型下载至关重要
}
fclose($fp);
?>
Vinay Kotekar
9 年前
将 PHP 文件保存为 ANSI 不会出现问题,但是当由于各种原因将文件保存为 UTF-8 格式时,请记住将文件保存为没有任何 BOM(字节顺序标记)支持。
否则,您将遇到头部无法正确发送的问题
例如。
<?php header("Set-Cookie: name=user");?>

将显示如下内容:

警告:无法修改头部信息 - 头部已由 (输出开始于 C:\www\info.php:1) 在 C:\www\info.php 第 1 行发送
Cody G.
14 年前
经过大量研究和测试,我想分享一下我关于 Internet Explorer 和文件下载问题的发现。

请看这段代码,它复制了 JavaScript 的正常下载过程

<?php
if(strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) {
header("Content-type: text/javascript");
header("Content-Disposition: inline; filename=\"download.js\"");
header("Content-Length: ".filesize("my-file.js"));
} else {
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=\"download.js\"");
header("Content-Length: ".filesize("my-file.js"));
}
header("Expires: Fri, 01 Jan 2010 05:00:00 GMT");
if(
strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) {
header("Cache-Control: no-cache");
header("Pragma: no-cache");
}
include(
"my-file.js");
?>

现在让我解释一下

我首先检查是否为 IE,如果不是 IE,我将 Content-type(区分大小写)设置为 JS,并将 Content-Disposition(从现在开始所有头部都区分大小写)设置为 inline,因为除了 IE 之外的大多数浏览器都喜欢内联显示 JS。(用户可以更改设置)。Content-Length 头部是某些浏览器激活下载框所必需的。然后,如果是 IE,“application/force-download” Content-type 有时是显示下载框所必需的。如果您不想在浏览器中显示 PDF(在 IE 中),请使用它。在这里我使用它来确保框打开。无论如何,我将 Content-Disposition 设置为 attachment,因为我已经知道框会显示。然后,我又有了 Content-Length。

现在,这是我的重点。只有在不使用 IE 的情况下,我才发送 Cache-Control 和 Pragma 头部。这些头部将阻止在 IE 上下载!!!只使用 Expires 头部,毕竟,它将要求下次再次下载文件。这不是错误!IE 将下载存储在临时 Internet 文件夹中,直到下载完成。我知道这一点,因为我曾经将一个大型文件下载到我的文档中,但下载对话框将其放在 Temp 文件夹中,并在最后将其移动。仔细想想。如果 IE 需要将文件下载到 Temp 文件夹,设置 Cache-Control 和 Pragma 头部将导致错误!

我希望这能为其他人节省一些时间!
~Cody G.
Angelica Perduta
4 年前
我创建了一个脚本,使用 404 脚本来调整和缩小原始图像,为网页生成优化后的图像,但在某些服务器上,它会生成图像,但由于某个地方的 404 状态缓存,无法使用它。我设法使用以下方法使其工作,尽管我不太理解,但我希望在这里发布能帮助其他遇到类似问题的人

header_remove();
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
// ...然后尝试重定向
// 201 = 请求已完成,导致创建了一个新资源,但它仍然没有加载
// 302 "临时移动" 似乎可以加载它!
header("location:$dst", FALSE, 302); // 现在我们拥有它,重定向到该文件
nobileelpirata at hotmail dot com
17 年前
这些是强制浏览器在 HTTP/1.0 和 HTTP/1.1 中使用最新内容(无缓存)的头部

<?PHP
header
( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' );
header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' );
header( 'Cache-Control: no-store, no-cache, must-revalidate' );
header( 'Cache-Control: post-check=0, pre-check=0', false );
header( 'Pragma: no-cache' );

?>
bMindful at fleetingiamge dot org
21 年前
如果您还没有使用,HTTP 响应 204 可以非常方便。204 告诉服务器立即终止此请求。如果您希望 JavaScript(或类似)客户端函数执行服务器端函数,而无需刷新或更改当前网页,这将很有帮助。非常适合更新数据库、设置全局变量等。

header("status: 204");(或其他调用)
header("HTTP/1.0 204 No Response");
er dot ellison dot nyc at gmail dot com
8 年前
不要在 location 和冒号之间加空格,
// 不要使用此方法
header("Location : #whatever"); // -> 不起作用!

// 而是使用这个 ->
header("Location: #wahtever"); // -> 将永远起作用!
hamza dot eljaouhari dot etudes at gmail dot com
6 年前
// 注意,在关键字“Location”和冒号之间添加空格会导致内部服务器错误

// 这一行会导致错误
7
header('Location : index.php&controller=produit&action=index');

// 而它必须不带空格
header('Location: index.php&controller=produit&action=index');
jamie
15 年前
文件的编码由 Content-Type 确定,无论是 HTML meta 标签还是 HTTP 头部的一部分。因此,服务器和浏览器不需要 - 也不期望 - Unicode 文件以 BOM 标记开头。BOM 也会使 *nix 系统困惑。更多信息请访问 http://unicode.org/faq/utf_bom.html#bom1

另一方面:Safari 可以显示 CMYK 图像(至少 OS X 版本可以,因为它使用 QuickTime 的服务)
ASchmidt at Anamera dot net
6 年前
设置 "Location: " 头部有另一个未记录的副作用!

它还会忽略任何明确设置的 "Content-Type: " 并强制

"Content-Type: text/html; charset=UTF-8"

HTTP RFC 没有要求这种极端的做法。它们只是说明重定向内容应该包含指向目标页面的链接(在这种情况下,任何与 HTML 兼容的内容类型都可以)。但 PHP 甚至会覆盖完全符合标准的
"Content-Type: application/xhtml+xml"!
cedric at gn dot apc dot org
13 年前
设置 Location 头部“向浏览器返回 REDIRECT (302) 状态码,除非 201 或 3xx 状态码已设置”。如果您正在向 POST 请求发送响应,您可能需要查看 RFC 2616 第 10.3.3 和 10.3.4 节。建议如果您希望浏览器立即获取 Location 头部中的资源,在这种情况下,您应该使用 303 状态码而不是 302(使用与正文中的超文本相同的链接,适用于非常旧的浏览器)。这可能会产生(罕见的)后果,如错误 42969 中所述。
To Top