关于php 的一些 header() 知识点

今天做了下文件下载功能,用了header()输出

/**
 * 下载文件 
 * @param unknown $outputFileName
 * @param unknown $filePath
 */
function sp_out_file($outputFileName,$filePath){
	$file = fopen($filePath,"r");
	ob_end_clean();  //清空缓存
 	header("Cache-Control: no-cache");
  	header("Pragma: no-cache");
	header("Content-Type:application/force-download");//强制下  txt 不预览 强制下载
	header("Content-Type:application/octet-stream");
	header("Content-Type:application/download");
	header('Content-Disposition:attachment;filename="'.$outputFileName.'"');
	echo fread($file,filesize($filePath));
	fclose($file);
	exit();
}


了一个比较简单的函数,但是对于header里面的一些参数 我并不是很清楚。于是查查资料,了解下head()的一些说明


看了php手册 

header

(PHP 4, PHP 5, PHP 7)

header 发送原生 HTTP 头

说明

void header ( string $string [, bool $replace = true [, int $http_response_code ]] )

header() 用于发送原生的 HTTP 头。关于 HTTP 头的更多信息请参考 » HTTP/1.1 specification

请注意 header() 必须在任何实际输出之前调用,不管是普通的 HTML 标签,还是文件或 PHP 输出的空行,空格。这是个常见的错误,在通过includerequire,或者其访问其他文件里面的函数的时候,如果在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
header
("HTTP/1.0 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);
?>

http_response_code

强制指定HTTP响应的值。注意,这个参数只有在报文字符串(string)不为空的情况下才有效。 


不多说

 Location-----这个应该就是跳转的意思

 一般可以指定某个网址 http://www.baidu.com  当然也是可以 跳转到站点下某个地址 Location: /test/test.html


<?php  
// header('Location:/test/test1.php');

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

?>


效果如上 ,正如php手册说的  在 Apache 服务器上用 PHP 脚本来处理不存在文件的请求(使用 ErrorDocument 指令), 就会希望脚本响应了正确的状态码




2. header('Content-type: application/pdf');

从网上拷贝了一些类型  参考地址 http://tool.oschina.net/commons点击打开链接   如果省的麻烦配置哪些文件 下载 就配置 

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



3. header('Content-Disposition: attachment; filename="downloaded.pdf"');

网上解释是   Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。(请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。) 

Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。具体的定义如下:

content-disposition = "Content-Disposition":"

disposition-type *( ";" disposition-parm )

disposition-type = "attachment" | disp-extension-token

disposition-parm = filename-parm | disp-extension-parm

filename-parm = "filename" "=" quoted-string

disp-extension-token = token

disp-extension-parm = token "=" ( token | quoted-string )

那么由上可知具体的例子:

Content-Disposition: attachment; filename="download.pdf"

 当然filename参数可以包含路径信息,但User-Agnet会忽略掉这些信息,只会把路径信息的最后一部分做为文件名。当你在响应类型为application/octet- stream情况下使用了这个头信息的话,那就意味着你不想直接显示内容,而是弹出一个”文件下载”的对话框,接下来就是由你来决定“打开”还是“保存” 了。

注意事项:

1.当代码里面使用Content-Disposition来确保浏览器弹出下载对话框的时候。一定要确保没有做过关于禁止浏览器缓存的操作。如下:

  header("Cache-Control: no-cache");
 
header("Pragma: no-cache");

不然会发现下载功能在operafirefox里面好好的没问题,在IE下面就是不行,就是找不到文件。


 4. header("Cache-Control: no-cache");

Cache-Control 有这么几种

no-cache/must-revalidate/no-store

参考网上说的

(1) 打开新窗口
如果指定cache-control的值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如:
Cache-control: max-age=5
表示当访问此网页后的5秒内再次访问不会去服务器
(2) 在地址栏回车
如果值为private或must-revalidate(和网上说的不一样),则只有第一次访问时会访问服务器,以后就不再访问。如果值为no-cache,那么每次都会访问。如果值为max-age,则在过期之前不会重复访问。
(3) 按后退按扭
如果值为private、must-revalidate、max-age,则不会重访问,而如果为no-cache,则每次都重复访问
(4) 按刷新按扭
无论为何值,都会重复访问

当指定Cache-control值为“no-cache”时,访问此页面不会在Internet临时文章夹留下页面备份。
另外,通过指定“Expires”值也会影响到缓存。例如,指定Expires值为一个早已过去的时间,那么访问此网时若重复在地址栏按回车,那么每次都会重复访问:
Expires: Fri, 31 Dec 1999 16:00:00 GMT

在ASP中,可以通过Response对象的Expires、ExpiresAbsolute属性控制Expires值;通过Response对象的CacheControl属性控制Cache-control的值,例如:
Response.ExpiresAbsolute = #2000-1-1# ' 指定绝对的过期时间,这个时间用的是服务器当地时间,会被自动转换为GMT时间
Response.Expires = 20  ' 指定相对的过期时间,以分钟为单位,表示从当前时间起过多少分钟过期。
Response.CacheControl = "no-cache" 

点击打开链接



有一篇文章更详细的介绍了  关于 header头的一些信息  

http://www.cnblogs.com/Joans/p/3956490.html 点击打开链接


如果有兴趣的同学也可以看 https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html 点击打开链接 这个是英文文档


还有这篇知乎 讲了一些 http2.0 与 1.0的区别 也可以去了解下点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值