最近看雅虎黄金34条,学习下优化网站性能的方法。其中有一条:“为文件头指定expires或cache-control”,具体来说指对于静态内容:设置文件头过期时间expires的值为“never
expire”永不过期;而对于动态内容:使用恰当的cache-control文件头来帮助浏览器进行有条件的请求。
这一条可以和雅虎34条的第一条联系起来,那就是尽量减少http的请求次数(雅虎34条很多都是努力去减少http请求为目的的),毕竟如果有太多的资源需要下载需要新的http链接叠加起来的耗时是不容忽视的。所以可以利用缓存技术来对网站的性能加以优化,从而避免不必要的http请求。刚好可以顺便整理下浏览器相关的缓存技术和与缓存相关的http的头:
1.expires(过期时间):
http头信息expires(过期时间)
属性是http控制缓存的基本手段,告诉浏览器缓存保存的时间。过了这个时间,缓存器就会向源服务器发送请求,检查文档是否被修改。适用于设置静态图片文件等等,而且对于控制有规律改变的网页也很有用,比如设置间隔固定的时间去更新等等;如果使用了expires文件头,当页面内容改变时就必须改变内容的文件名。比如yahoo经常使用这样的步骤:在内容的文件名中加上版本号,如yahoo_2.0.6.js,从而能够主动进行更新。
使用expires: 如果你使用的是服务器,可以使用expiresdefault来设定相对当前日期的过期时间,使用mod_expires,在httpd.conf或者.htaccess中加上
2.cache-control
各个消息中的指令含义如下:
1.public指示响应可被任何缓存区缓存;
2.private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
3.no-cache指示请求或响应消息不能缓存;
4.no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存;
5.max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
6.min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
7.max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息;
举例:
一般说来这种静态文件永远不应该过期,如果真的要给这个cache加上一个期限,那我希望是
——一万年
即:“cache-control:
max-age = 315360000000”
3.last-modified/if-modified-since
http/1.1 200 ok
last-modified:
tue, 12 dec 2006 03:03:59 gmt
etag: “10c24bc-4ab-457e1c1f”
content-length: 12195
稍后,如果浏览器要验证一个文件,它会使用if-none-match文件头来把etag传回给原始服务器。在这个例子中,如果etag匹配,就会返回一 个304状态码,这就节省了12195字节的响应。
get
/i/yahoo.gif http/1.1
host: us.yimg.com
if-modified-since: tue, 12 dec 2006 03:03:59 gmt
if-none-match: “10c24bc-4ab-457e1c1f”
http/1.1 304 not modified
关于以上几种缓存机制的优先级,在网上找到一种说法:
no-cache>expires>last-modified
也就是讲,最前面的最重要,前面的生效后,后面的基本就失效了