http缓存概述

当我们在用户代理端(浏览器)通过http协议访问某个互联网资源时,其请求和响应过程可能会经过多个中间缓存服务器,大致如下图所示

浏览器请求及响应

图中的浏览器和后端服务器是完成http请求交互的双方,而身处中间的缓存服务器只是充当了中间人角色,对于交互的双方来说,中间人可以起到一个传话筒的作用,也可以基于通信双方的要求做些必要的事情。HTTP规范为通信各方定义了统一的行为准则。

HTTP 缓存是一种响应消息的本地存储,以及控制其内的消息的存储、获取和删除的子系统。缓存存储了可缓存的响应是为了减少将来的响应时间和网络带宽消耗。任何客户端或者服务器可以使用缓存,但是,当服务器作为隧道而使用时,不能使用缓存。

共享缓存是一种缓存,它存储响应用于给一个以上的用户来复用,通常(但并不总是)部署作为一个中间人的一部分。与之相对的是私有缓存,这种缓存专门用于某一个用户,通常部署为一个用户代理的一个组件。

主要的缓存 key 是由请求方法以及目标 URI 组成的(可能带有查询组件)。但是,因为如今普遍使用的 HTTP 缓存通常都被限制为只对 GET 的响应进行缓存,因此,许多缓存简单地拒绝其他方法,并只使用 URI 作为主要的缓存 key。

1, 可缓存的方法

  • GET
    回应给 GET 请求的响应是可缓存的,缓存以 使用它来满足随后的 GET 和 HEAD 请求,除非 Cache-Control 头字段另有指定
  • HEAD
    回应给 HEAD 请求的响应是可缓存的,缓存可以使用它来满足随后的 HEAD 请求,除非 Cache-Control 头字段另有指定
  • POST
    回应给 POST 请求的响应,仅当它们包含明确的新鲜信息时,才是可缓存的(对 POST响应的缓存并没有被广泛实现)

2, 可缓存的状态码

响应如果带有被定义为默认是可缓存的状态码(比如 200、203、204、206、300、301、404、405、410、414 和 501),那么,该响应能够被一个使用试探性过期的缓存所复用,除非在请求方法的定义或者显式缓存控制里另有指定;其他所有状态码默认是不可缓存的。

状态码 说明
\color{green}{200} OK 请求成功。
\color{green}{203} Non-Authoritative Information 服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。
\color{blue}{206} Partial Content 服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。
\color{green}{300} Multiple Choice 被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。
\color{green}{301} Moved Permanently 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。
\color{red}{302} Found 请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
\color{red}{307} Temporary Redirect 请求的资源现在临时从不同的URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
\color{green}{410} Gone 被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应当被认为是永久性的。

\color{red}{注意:以上列出的状态码并不完整,更多可参考规范RFC7231 }

需要注意的是,所有状态码能够被缓存,仅当这个响应里带有明确的新鲜度信息;但是,定义为可缓存的状态码是允许在没有明确的新鲜度信息的情况下被缓存的。同样,状态码的定义能够在缓存行为上施加约束。

3, 可被存储的响应规则

1)请求方法被定义为可缓存的,且可被缓存所理解,并且
2)响应的状态码可被缓存所理解,并且
3)在请求或响应头字段中不包含“no-store”指令,并且
4)如果是共享缓存,则在响应头中不包含“private”指令,并且
5)如果是共享缓存,则在请求头中不包含Authorization头字段,除非响应明确允许缓存,并且
6)响应满足以下任何一个条件:

  • 包含一个Expires头字段
  • 包含一个max-age响应指令
  • 包含一个s-maxage响应指令(共享缓存)
  • 包含缓存控制扩展(Cache Control Extension)来允许可被缓存
  • 拥有一个默认定义为可被缓存的状态码
  • 包含一个public响应指令

需要注意的是,上述所列出的任何要求都可以被 cache-control 扩展所覆盖

因为源服务器并不总是会提供明确过期时间的,因此,当它没有指定一个过期时间的时候,缓存可以指派一个启发式过期时间,原理是利用一种使用其他头字段值来估算出一个看似合理的过期时间的算法。

当响应中未提供明确的过期时间,同时其响应的状态码是可缓存的,或响应被明确标记为可缓存的(比如,带有一个 public 响应指令)情况下,如果响应带有一个 Last-Modified 头字段,规范鼓励缓存所使用的启发式过期时间的值不超过那个头字段的时间以后的某个比例,通常这个比例会设置为 10%

注意: 对于带有 query 组件的 URI(也就是说,包含有 "?" 的 URI),【RFC2616】章节 13.9 禁止缓存对这种 URI 计算启发式新鲜度。实践中,这项要求并未被广泛实现。因此,规范鼓励源服务器去发送明确的指令(比如,Cache-Control: no-cache),如果它们希望阻止缓存的话。

需要注意的是,在常规操作中,如果一个响应既没有缓存验证器也没有一个明确过期时间,某些缓存将不会存储这种响应,因为存储这种响应通常是没有用处的。但是,缓存不会被禁止存储这种响应。

对于响应中只要etag的情况,等同于响应头中带有Cache-Control:no-cache效果一般。

更多的可参考:https://www.rfc-editor.org/info/rfc7234

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容