一、背景
平时我们在写代码的时候经常用定义header()
相关的东西,以前博主也只是知其然不知其所以然,这里总结一下,希望以后再碰到需要定义header的需求,能快速知道自己该这么做。
二、什么是header
提起来header,首先想起来的就是请求头,然后想起http协议相关。身为一个程序员,这辈子怕是和http结缘了。咱们这边先不管http相关的东西,先说header。
概述 :一个网络请求路由到目标机器后,目标机器总要知道它要请求什么,以什么编码方式传输,数据长度等信息,这是表头要表达的内容
文档:http://www.w3school.com.cn/php/func_http_header.asp
二、用到header的实例
1、为什么要用header
对后端人员来说,用header可以控制前端页面的输出。比如输出json还是image。还能拒绝一些域名的访问,比如laravel的中间件部分。可以限制前端页面缓存或者直接跳转页面等。或者是我们需要在方法里面通过curl请求的时候,根据需求会自定义header部分等
2、具体的实例
(1)招聘网站的缓存
比如我们在招聘网站搜索职位的时候,我们的需求应该是页面不能有缓存,用户搜索什么,页面必须立即显示。那么这部分我们可以在接口中定义header来实现该需求:
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); //这个是为了适应IE浏览器的缓存机制
具体参考链接:https://blog.youkuaiyun.com/fatong3/article/details/67638848
(2)验证token 的中间件的跳转 :
我们在验证身份的时候,验证信息的方法无非是(1、URL的get参数,2、协议的头Header中,3、协议的请求正文内),包括博主这边用到的laravel验证身份的中间件,原理上也是通过把token放到header中实现的。
$request->headers->set('Authorization', 'Bearer ' . $token);
参考链接:
https://blog.youkuaiyun.com/qq_16234613/article/details/78843010
https://blog.youkuaiyun.com/huangwenting1990/article/details/52261592
(3)控制页面返回内容
这部分常用的就是php绘图,然后直接返回图片给页面。或者生成pdf,直接返回给页面等,这个时候就要定义header来实现。
(4)header还可以用在curl请求中
参考链接:https://www.cnblogs.com/handongyu/p/6955692.html
(5)限制特定的域名访问资源
这部分是可以通过header限制特定的域名访问咱们的资源,也是为了保证正式环境的安全,拒绝一些不必要的跨域请求,只允许我们已知的安全的域名来访问我们的资源。
代码:
$allow_origin = array(
'http://aaa.com',
'http://bbb.com',
);
$origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
if (in_array($origin, $allow_origin)) {
header("Access-Control-Allow-Origin:" . $origin);
}
限定域名访问也和咱们经常碰到的跨域问题有关,大家有兴趣可以搜一下:Access-Control-Allow-Origin
更多实例参考:https://www.cnblogs.com/chengshan/p/6526567.html
三、注意事项
(1)一般来说在header函数前不能输出html内容,类似的还有setcookie() 和 session 函数,这些函数需要在输出流中增加消息头部信息。
(2)如果在header()执行之前有echo等语句,当后面遇到header()时,就会报出 “Warning: Cannot modify header information – headers already sent by ….”错误。
(3)就是说在这些函数的前面不能有任何文字、空行、回车等,而且最好在header()函数后加上exit()函数。
以上就是博主对header做的一次小总结了,看了很多文章,也结合自己碰到的情况总结的。感觉header还是挺常用的,关键还是理解http协议吧,内容很多,加油。
end