header 发送原生 HTTP 头
发表日期:2021-07-01 08:56:41 | 来源: | | 浏览(1021) 分类:网络 函数
header
(PHP 4, PHP 5, PHP 7, PHP 8)
header — 发送原生 HTTP 头
说明
$string
, bool $replace
= true, int $response_code
= ?): voidheader() 用于发送原生的 HTTP 头。关于 HTTP 头的更多信息请参考 » HTTP/1.1 specification。
请注意 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; ?>
参数
-
string
-
头字符串。
有两种特别的头。第一种以“
HTTP/
”开头的 (case is not significant),将会被用来计算出将要发送的HTTP状态码。 例如在 Apache 服务器上用 PHP 脚本来处理不存在文件的请求(使用ErrorDocument
指令), 就会希望脚本响应了正确的状态码。<?php // 本示例演示了 "HTTP/" 的特殊例子,典型用法的最佳实践,包括:// 1. header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found"); // (覆盖 http 状态消息,兼容还在使用 HTTP/1.0 的客户端)// 2. http_response_code(404); (使用默认消息)header("HTTP/1.1 404 Not Found"); ?>
第二种特殊情况是“Location:”的头信息。它不仅把报文发送给浏览器,而且还将返回给浏览器一个
REDIRECT
(302)的状态码,除非状态码已经事先被设置为了201
或者3xx
。<?php header("Location: http://www.example.com/"); /* Redirect browser */ /* Make sure that code below does not get executed when we redirect. */ exit; ?>
-
replace
-
可选参数
replace
表明是否用后面的头替换前面相同类型的头。 默认情况下会替换。如果传入false
,就可以强制使相同的头信息并存。例如:<?php header('WWW-Authenticate: Negotiate'); header('WWW-Authenticate: NTLM', false); ?>
-
response_code
-
强制指定 HTTP 响应的值。注意,这个参数只有在报文字符串(
header
)不为空的情况下才有效。
返回值
没有返回值。
范例
示例 #1 下载对话框
如果你想提醒用户去保存你发送的数据,例如保存一个生成的PDF文件。你可以使用» Content-Disposition的报文信息来提供一个推荐的文件名,并且强制浏览器显示一个文件下载的对话框。
<?php // 输出 PDF 文件header('Content-type: application/pdf'); // 名称为 downloaded.pdfheader('Content-Disposition: attachment; filename="downloaded.pdf"'); // 该 PDF 来源于 original.pdfreadfile('original.pdf'); ?>
示例 #2 缓存指令
PHP 脚本经常生成一些动态内容,它不该被客户端、服务器与浏览器之间的代理缓存。 许多代理与客户端都支持这样强制禁用缓存:
<?php header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // 过去的日期?>
注意:
也许你会遇到这样的情况,那就是即使你没使用上面这段代码,你的页面也没有被缓存。大多数情况是因为用户可以自己设置他们的浏览器从而改变浏览器默认的缓存行为。一旦发送了上面这段报文信息,那么你就应该重写那些可能用到缓存了的代码。
此外,在启用session的情况下,session_cache_limiter()和
session.cache_limiter
的配置可以用来自动地生成正确的缓存相关的头信息。
注释
注意:
数据头只会在SAPI支持时得到处理和输出。
注意:
你所有需要输出到浏览器的数据将会一直缓存在服务器端,直到你发送他们,这将造成比较大的资源开销。你可以是用输出缓冲来避开这个问题。你可以通过在脚本里使用ob_start()和ob_end_flush()或者直接在你的php.ini文件里设置
output_buffering
,也可以直接在服务器的配置文件里设置。
注意:
HTTP状态信息的报文永远都是最新被发送到客户端的,而不管header()是否是在最先发送的。报文状态码可能会被重写,当调用header()来设定新的状态码,除非HTTP报文已经被发送了。
注意:
在IE 4.01和IE 5.5里有bug,要解决就升级浏览器吧,想必也没人用那么远古的神器了吧。
注意:
绝大多数现代浏览器的 » Location: 都支持相对 URI,但也有一些旧浏览器需要绝对 URI:包含协议、主机名、绝对路径。 一般情况下,可以借助 $_SERVER['HTTP_HOST']、$_SERVER['PHP_SELF']、 dirname() 将相对地址组合成绝对 URI:
<?php /* 根据当前请求所在的目录,重定向到不同的页面 */ $host = $_SERVER['HTTP_HOST']; $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); $extra = 'mypage.php'; header("Location: http://$host$uri/$extra"); exit; ?>
注意:
在执行Location header跳转的时候,Session ID无法通传递的,即使session.use_trans_sid是激活状态的。只能通过手动传递using
SID
的值来实现。
参见
- headers_sent() - 检测 HTTP 头是否已经发送
- setcookie() - 发送 Cookie
- http_response_code() - 获取/设置响应的 HTTP 状态码
- The section on HTTP authentication
- PHP(0)
- PHP杂项(34)
- PHP基础-李炎恢系列课程(20)
- 中文函数手册(0)
- 错误处理 函数(13)
- OPcache 函数(6)
- PHP 选项/信息 函数(54)
- Zip 函数(10)
- Hash 函数(15)
- OpenSSL 函数(63)
- Date/Time 函数(51)
- 目录函数(9)
- Fileinfo 函数(6)
- iconv 函数(11)
- 文件系统函数(81)
- 多字节字符串 函数(57)
- GD 和图像处理 函数(114)
- 可交换图像信息(5)
- Math 函数(50)
- 程序执行函数(11)
- PCNTL 函数(23)
- JSON 函数(4)
- SPL 函数(15)
- URL 函数(10)
- cURL 函数(32)
- 网络 函数(33)
- checkdnsrr 给指定的主机(域名)或者IP地址做DNS通信检查(0)
- closelog 关闭系统日志链接(0)
- dns_check_record 别名 checkdnsrr()(0)
- dns_get_mx 别名 getmxrr()(0)
- dns_get_record 获取指定主机的DNS记录(0)
- fsockopen 打开一个网络连接或者一个Unix套接字连接(0)
- gethostbyaddr 获取指定的IP地址对应的主机名(0)
- gethostbyname 返回主机名对应的 IPv4地址。(0)
- gethostbynamel 获取互联网主机名对应的 IPv4 地址列表(0)
- gethostname 获取主机名(0)
- getmxrr 获取互联网主机名对应的 MX 记录(0)
- getprotobyname Get protocol number associated with protocol name(0)
- getprotobynumber Get protocol name associated with protocol number(0)
- getservbyname 获取互联网服务协议对应的端口(0)
- getservbyport Get Internet service which corresponds to port and protocol(0)
- header_register_callback 调用一个 header 函数(0)
- header_remove 删除之前设置的 HTTP 头(0)
- header 发送原生 HTTP 头(0)
- headers_list 返回已发送的 HTTP 响应头(或准备发送的)(0)
- headers_sent 检测 HTTP 头是否已经发送(0)
- http_response_code 获取/设置响应的 HTTP 状态码(0)
- inet_ntop Converts a packed internet address to a human readable representation(0)
- inet_pton Converts a human readable IP address to its packed in_addr representation(0)
- ip2long 将 IPV4 的字符串互联网协议转换成长整型数字(0)
- long2ip 将长整型转化为字符串形式带点的互联网标准格式地址(IPV4)(0)
- openlog Open connection to system logger(0)
- pfsockopen 打开一个持久的网络连接或者Unix套接字连接。(0)
- setcookie 发送 Cookie(0)
- setrawcookie 发送未经 URL 编码的 cookie(0)
- socket_get_status 别名 stream_get_meta_data()(0)
- socket_set_blocking 别名 stream_set_blocking()(0)
- socket_set_timeout 别名 stream_set_timeout()(0)
- syslog Generate a system log message(0)
- FTP 函数(36)
- Session 函数(23)
- PCRE 函数(11)
- PCRE 正则语法(19)
- 数组 函数(81)
- 类/对象 函数(18)
- 函数处理 函数(13)
- 变量处理 函数(37)
- SimpleXML 函数(3)
- 杂项 函数(31)
- 字符串 函数(101)