好!欢迎访问迷津渡口 现在时间是:

迷津渡口

越感到迷惑 越接近真理

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函数非常强大,可以做的事情非常多,上面只是常用的几种。

其他的欢迎各位大神留言补充~

点赞0
   支持一下
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
 点赞
 签到
 表情
 图片
 代码
提交评论

清空信息
关闭评论
 00:00/00:00
我想和你虚度时光 - 花房姑娘(9)
  1. 恋恋风尘
  2. 恋恋风尘
  3. 恋恋风尘
  4. 恋恋风尘
  5. 恋恋风尘
  6. 恋恋风尘
  7. 恋恋风尘
  8. 恋恋风尘
  9. 恋恋风尘