引用:http://xmwang2.blog.51cto.com/2773430/530737
作者:terencewk
为什么要讲 HTTP 头?
1、 非常简单的通过 HTTP 头,可以让你的用户打开速度快 10 倍
2、 网上讲 HTTP 头的文章,都讲的太玄乎和专业,实际价值不大
3、 太多人看了太多乱七八糟的文章,加了很多自己也不知道干嘛用的 HTTP 头
4、 HTTP 头过大会阻塞你的用户访问,你考虑过吗?如何让你的 HTTP 头正好够用,能够起到效果又不要过于臃肿堵塞你的用户,你考虑过吗?
什么是 HTTP 头?
HTTP 协议采用了请求 / 响应模型。
客户端向服务器发送一个请求,请求头包含请求的方法、 URI 、协议版本、以及包含请求修饰符、客户信息和内容的类似于 MIME 的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。
以上是抄来的,其实我不想讲,呵呵,但是普及下吧。
下面是我们这一篇中主讲的
HTTP 响应头的管理
哪些是常用的 HTTP 响应头?
看图:
总结来看,常用的 HTTP 头如下:
协议 状态码 | HTTP/1.0 200 OK |
服务器时间 | Date: |
服务器 | Server: |
文件类型 | Content-Type: |
自适应 | Vary: Accept-Econding |
备注: sohu 的网站用的 Vary 后有很多选项,是为了手机访问给对应格式页面的,但是这个方式,哥甚不赞同 | |
最后修改时间 | Last-Modified: |
备注: www.qq.com 没有该项,所以,悲剧的 qq ,当他的用户每次点击刷新时,别的网站都是个发送 If-Modify-Since 请求,返回 304 无变化只需要几百字节,而 qq 的用户则需要直接请求,全新拿文件,从几百字节消耗变成 5W 多个字节 | |
压缩格式 | Content-Econding: gzip |
备注:了解这个妙用,看俺的第三弹 | |
过期时间 | Expires: |
备注:哥一直认为,这是个非常渣的 HTTP 头,没想到四大门户都有这个头,啧啧,预计在第五弹我会批判这个 | |
缓存设置 | Cache-Control: max-age= |
经过缓存服务器后的各种头 | Age: X-cache: Via: FSS-cahe: 等等 |
备注:这个再一次说明了,中国的互联网早就是缓存服务器的天下了,具体见第三弹 | |
综合以上的以上,我充满信心的说,以前我和很多人争论过的, Etag 头对于 99% 的网站就是垃圾这件事情,得到了充分证实,这四大门户首页,没有一个用 Etag 头的。 |
哪些头需要好好管理?
Cache-Control
这是个无比妙用的头,它可以让你的首页,从 2MB ,变成 200KB 。
没错,就是它。
我们先看看别人用了它之后,做到了啥。
网站 | 首次打开大小 | 再次打开大小 | 首次请求数 | 再次请求数 |
505KB | 45KB | 92 | 18 | |
1261KB | 800KB | 186 | 94 | |
738KB | 296KB | 151 | 61 | |
1784KB | 487KB | 247 | 66 |
减少了这么多,网站和用户双赢,靠的就是这个头。下面我将讲下具体如何用。
Last-Modify
这个头好用,那就用是了,为什么还要单独拿出来说?
是因为这个头,有个小的隐藏风险,见过很多人中标,我指出来,希望更多的人可以看到,之后避免。
很多网站,在更新网站或者发布网站临时维护信息时,会采用将老的文件,剪切到其他目录,然后本地再上传一个同名文件进行文件更新或者网站的页面更新。当更新的页面出问题或者维护结束他们使用正常页面给用户服务,会立刻把老的文件剪切回来,覆盖旧文件。
这就有一个非常大的问题。
因为对于已经访问过网站的人来说,他们已经把文件缓存到了本地。当用户再次访问网站时,会发送一个 If-Modify-Since 请求。
老文件 Last-Modified: 旧时间
新文件 Last-Modified: 新时间
当你用旧文件替换新文件后,由于新文件的最后修改时间要早于旧文件的,所以, IE 不会让用户拿到没有问题的旧文件,而是让他们使用新文件。
所以,如果你使用用旧文件替代新文件,一定要对旧文件做个小的处理,使其更新最后修改时间,不然,用户依然会访问出问题的页面或者是维护页面。
如何用好 Cache-Control ?
当你不想让用户缓存时,你只需要添加一个头, no-store 即可,其他 no-cache 、 must 、 must-revalidate 、 proxy-revalidate 等都没必要用,因为 no-store 一般默认为最高级。
其他可以让用户缓存的页面,区分目录,根据不同的目录,配置不同的 max-age 头。
max-age 啥用处?
用户得到 HTTP 响应头后,会根据本地时间,加上 max-age 的时间,形成一个过期时间。例如,用户本次时间为 11:00 , max-age 设置为 600 ,那么文件拿到后,过期时间为 11:10 分。也就是这个用户,在 11:10 分以前,访问这个文件,就会直接缓存命中,而不会对服务器发出请求。
所以, max-age 的运用就可以让你的网站像那四大门户一样,大小减少到原来的 10 分之一,请求数也会短期内得到巨大的减少。
如何设置 Cache-Control ?
如何设置百度娘之。
管理上的建议:
你不可能针对每个文件配置 Cache-Control ,所以,最好是先拆分域名,将不同应用(文件类一个域名,图片类一个域名等等)配置不同的缓存控制头。
如果你的网站属于大中型网站,如网页访问带宽在 100M 以上的,可能针对域名配置不同缓存控制头,已经不能满足你的需求了,这个时候,就可以管理好你的目录。
将文件根据你们网站特点分到不同目录,然后针对目录,配置不同的缓存控制头。
max-age 设置多大?
以下提出的均为建议值,但是最适合你的,是你自己根据网站特点进行的缓存时间配置。
首页,建议为 900 ,也就是 15 分钟。
文本类文件,建议为 10800 ,也就是 3 小时。
图片类文件,建议为 86400 ,也就是 24 小时。
Swf 类文件,建议为 604800 ,也就是 7 天。
flv 、 exe 类文件,建议为 31536000 ,也就是 1 年。