http缓存机制总结和文章推荐

推荐阅读:
伯乐在线——HTTP 缓存机制一二三
IMWeb前端博客——HTTP缓存控制小结
IT笔录——http消息头html

http缓存机制

关键头部字段
  • cache-control、 Pragma
  • if-Match、if-None-Match
  • if-Modified-Since、if-Unmodified-Since
  • ETag
  • Expires、Last-Modified

Pragma

http1.0可用,如今为了向下兼容,也设置该头部,只有一个值:no-cache禁用缓存前端


Expires

设置缓存时间(该时间相对于服务器),接受一个GMT(格林尼治时间),用来告诉浏览器过时时间,若是尚未过这个时间则不发送请求。web

Expires: Sun Jul 15 2018 19:13:07 GMT

cache-control

也可用来设置缓存时间,http1.1与http1.0可用,三者优先级:浏览器

Pragma > Cache-Control > Expires

可设置多个值,好比经常使用的:no-cache, max-age, public, private缓存


Last-Modified

接受一个格林尼治时间,说明资源的最近一次的修改时间,该字段的做用是当某个资源保存的缓存时间过时了,但服务器并无更新过这个资源,那么能够告诉客户端此资源没有更新,能够获取缓存中的内容(返回304,不返回实体内容)服务器


if-Modified-Since

Last-Modified的值会在下一次的请求中经过if-Modified-Since传递给服务器,若是它的值和此时服务器的Last-Modified值一致,说明没有修改,服务器返回304。若是不一致则看成正常请求处理,返回资源和200状态码。并发


ETag

服务端资源有可能被更新了,可是实际内容并无改变。可是这样依然会引发Last-Modified的更新,服务器给客户端返回没有任何改变的内容。为了解决这个问题,引入了ETag。用于http1.1。
服务器为资源生成一个惟一的字符串,如经过md5编码。只要不变,生成的字符串就不变。在客户端请求资源的时候,将该ETag一块儿返回给客户端,客户端保留该ETag,下次请求的时候带上。而后比较ETag,相同则表示内容相同,返回304;不一样,返回资源和200状态码。优化


If-None-Match

ETag的值会经过if-None-Match头部传递给服务器,而后服务器比较ETag的值,相同则表示内容相同,返回304;不一样,返回资源和200状态码。编码


另外的 if-None-Match,if-Unmodified-Since

他们不是用来实现缓存策略的,而是用来优化并发控制,他们的做用是,使得当前请求成为条件式请求:只有当资源在指定的时间以后没有进行过修改的状况下,服务器才会返回请求的资源,或是接受 POST 或其余 non-safe 方法的请求。例如在某些场景:假如在原始副本获取以后,服务器上所存储的文档已经被修改,那么对其做出的编辑会被拒绝提交。code

总结

  1. Expires / Cache-Control用来设置缓存时间,即资源有效时间。状态码 200(from cache),可避免请求发送到服务器。
  2. Last-Modified / ETag用来判断资源是否被修改了。状态码 304(not change),可避免传输相同的资源内容,形成带宽和时间的浪费。

使用原则

  • 须要兼容HTTP1.0的时候须要使用Expires,否则能够考虑直接使用Cache-Control
  • 须要处理一秒内屡次修改的状况,或者其余Last-Modified处理不了的状况,才使用ETag,不然使用Last-- Modified。
  • 对于全部可缓存资源,须要指定一个Expires或Cache-Control,同时指定Last-Modified或者Etag。
  • 能够经过标识文件版本名、加长缓存时间的方式来减小304响应。
相关文章
相关标签/搜索