PHP的header函数范例详解
PHP的header函数是用于服务器向客户端发送原始的HTTP报头的函数,而HTTP报头是服务器以 HTTP 协议传 HTML 资料到浏览器前所送出的字串,与 HTML 文件之间尚需空一行分隔。
请注意 header() 必须在任何实际输出之前调用,不管是普通的 HTML 标签,还是文件或 PHP 输出的空行,空格。这是个常见的错误,在通过include,require,或者其访问其他文件里面的函数的时候,在header()被调用之前,其中也不能有空格或者空行。 同样的问题也存在于单独的 PHP/HTML 文件中。
关于HTTP的资料,可查看RFC2616文档,此文档详细定义介绍了HTTP1.1协议,当然也包含HTTP报头。
感谢翻译大神,小指分享了中文版在百度云盘:下载
函数定义和参数
void header(string $string [,bool $replace=true [,int $http_response_code ]])
参数表
参数 | 描述 |
---|---|
string | 必需。规定要发送的报头字符串。 |
replace | 可选。指示该报头是否替换之前的报头,或添加第二个报头。 默认是 true(替换)。false(允许相同类型的多个报头)。 |
http_response_code | 可选。把 HTTP 响应代码强制为指定的值。(PHP 4 以及更高版本可用) |
参数详解
string
必选的参数--报头字符串。
有两种特别的头:
第一种以 HTTP/ 开头的,将会被用来计算出将要发送的HTTP状态码。
例如,通知浏览器,页面不存在,使用404状态码。
<?php header("HTTP/1.1 404 Not Found"); ?>
第二种特殊情况是 Location: 的头信息。
它不仅把报文发送给浏览器,而且在事先未设置状态码为201或者3xx时返回给浏览器一个重定向--REDIRECT(302)的状态码。
<?php header("Location: http://www.qingzz.cn/"); /* 重定向到http://www.qingzz.cn */ /* 确保在重定向后面接上exit,防止脚本继续往下执行 */ exit; ?>
replace
可选参数 replace 表明是否用后面的头替换前面相同类型的头。 默认情况下会替换。如果传入 FALSE,就可以强制使相同的头信息并存。例如:
<?php header('WWW-Authenticate: Negotiate'); header('WWW-Authenticate: NTLM', false); ?>
http_response_code
强制指定HTTP响应的值。注意,这个参数只有在报头字符串(string)不为空的情况下才有效。
范例
范例一:重定向的两种方法
/* 方法一: Location */ <?php header("Location: http://www.qingzz.cn/";); exit; //在每个重定向之后都必须加上“exit",避免发生错误后,继续执行。 ?> /* 方法二: Url和Refresh <?php header("Refresh:3;Url=http://www.qingzz.cn/"); print('正在加载,请稍等...<br>三秒后自动跳转~~~'); ?>
范例二:发送状态码
<?php // 页面成功加载 header('HTTP/1.1 200 OK'); // 页面不存在 header('HTTP/1.1 404 Not Found'); // 访问地址已被永久重定向 header('HTTP/1.1 301 Moved Permanently'); // 通知浏览器文档内容没有发生改变 header('HTTP/1.1 304 Not Modified'); ?>
范例三:文件附件下载
<?php $filename = '路径+实际文件名'; //文件的类型 header('Content-type: application/pdf'); //下载显示的名字 header('Content-Disposition: attachment; filename="保存时的文件名.pdf"'); readfile("$filename"); exit(); ?>
一些常用的文件类型设置:
header('Content-Type: text/html; charset=iso-8859-1'); header('Content-Type: text/html; charset=utf-8'); header('Content-Type: text/plain'); //纯文本格式 header('Content-Type: image/jpeg'); //JPG图片 header('Content-Type: application/zip'); // ZIP文件 header('Content-Type: application/pdf'); // PDF文件 header('Content-Type: audio/mpeg'); // 音频文件 header('Content-Type: application/x-shockwave-flash'); //Flash动画
范例四:配置文件缓存
<?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状态码并输出文件 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); } ?>
范例五:页面禁用缓存
<?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'); ?>
范例六:页面密码保护
<?php // 自定义用户名和密码 $username='testUser'; $password='testPass'; if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || ($_SERVER['PHP_AUTH_USER'] != $username) || ($_SERVER['PHP_AUTH_PW'] != $password)) { // 未输入用户名和密码或输入不匹配,则输出两个HTTP报头,提示用户输入用户名和密码信息 // 输出401提示未授权 header('HTTP/1.1 401 Unauthorized'); // Basic realm是一个域,所有域名为test的页面登录时用户名和密码一致 header('WWW-Authenticate: Basic realm="test"'); // 当用户点击`Cancel`取消输入时输出下面的信息 exit('Sorry, you must enter a valid user name and password to access this page.'); } ?>
可以把上面的代码保存为一个文件authorize.php,然后在需要密码保护的页面最前面引用此文件:
<?php require_once('authorize.php'); ?>
如此便可以用密码保护页面了~
PHP的header函数非常强大,可以做的事情非常多,上面只是常用的几种。
其他的欢迎各位大神留言补充~