推荐阅读:
伯乐在线——HTTP 缓存机制一二三
IMWeb前端博客——HTTP缓存控制小结
IT笔录——http消息头html
关键头部字段
http1.0可用,如今为了向下兼容,也设置该头部,只有一个值:no-cache禁用缓存前端
设置缓存时间(该时间相对于服务器),接受一个GMT(格林尼治时间),用来告诉浏览器过时时间,若是尚未过这个时间则不发送请求。web
Expires: Sun Jul 15 2018 19:13:07 GMT
也可用来设置缓存时间,http1.1与http1.0可用,三者优先级:浏览器
Pragma > Cache-Control > Expires
可设置多个值,好比经常使用的:no-cache, max-age, public, private缓存
接受一个格林尼治时间,说明资源的最近一次的修改时间,该字段的做用是当某个资源保存的缓存时间过时了,但服务器并无更新过这个资源,那么能够告诉客户端此资源没有更新,能够获取缓存中的内容(返回304,不返回实体内容)服务器
Last-Modified的值会在下一次的请求中经过if-Modified-Since传递给服务器,若是它的值和此时服务器的Last-Modified值一致,说明没有修改,服务器返回304。若是不一致则看成正常请求处理,返回资源和200状态码。并发
服务端资源有可能被更新了,可是实际内容并无改变。可是这样依然会引发Last-Modified的更新,服务器给客户端返回没有任何改变的内容。为了解决这个问题,引入了ETag。用于http1.1。
服务器为资源生成一个惟一的字符串,如经过md5编码。只要不变,生成的字符串就不变。在客户端请求资源的时候,将该ETag一块儿返回给客户端,客户端保留该ETag,下次请求的时候带上。而后比较ETag,相同则表示内容相同,返回304;不一样,返回资源和200状态码。优化
ETag的值会经过if-None-Match头部传递给服务器,而后服务器比较ETag的值,相同则表示内容相同,返回304;不一样,返回资源和200状态码。编码
他们不是用来实现缓存策略的,而是用来优化并发控制,他们的做用是,使得当前请求成为条件式请求:只有当资源在指定的时间以后没有进行过修改的状况下,服务器才会返回请求的资源,或是接受 POST 或其余 non-safe 方法的请求。例如在某些场景:假如在原始副本获取以后,服务器上所存储的文档已经被修改,那么对其做出的编辑会被拒绝提交。code