HTTP缓存字段总结
程序员文章站
2022-03-28 16:28:37
首部 通用首部:有些首部提供了与报文相关的最基本的信息,它们被称为通用首部。 请求首部:请求首部是只在请求报文中有意义的首部。 响应首部 实体首部: 用来描述HTTP报文的负荷,由于请求和响应报文中都可能包含实 体部分,所以在这两种类型的报文中都可能出现这些首部。实体首部提供了有关实体及其内容的大量 ......
首部
- 通用首部:有些首部提供了与报文相关的最基本的信息,它们被称为通用首部。
- 请求首部:请求首部是只在请求报文中有意义的首部。
- 响应首部
- 实体首部: 用来描述http报文的负荷,由于请求和响应报文中都可能包含实
体部分,所以在这两种类型的报文中都可能出现这些首部。实体首部提供了有关实体及其内容的大量信息,从有关对象类型的信息,到能够对 资源使用的各种有效的请求方法。总之,实体首部可以告知报文的接收者它在对什 么进行处理。
与缓存相关的http首部字段
1:通用首部字段里:
2:请求首部字段里:
3:实体首部:
此处才开始正文~
pragma和expires来规范。虽然这两个字段早可抛弃,但为了做http协议的向下兼容,你还是可以看到很多网站依旧会带上这两个字段。
所以这里不再介绍过时的东东啦,大家简单了解这是关于缓存的就可以啦。
cache-control
这是个通用首部字段, 其有很多值可以设置:
- no-store:禁止缓存对响应进行复制
- no-cache: 可以存储在本地缓存区,但是在与原始服务器验证新鲜度之前不能给客户端使用。
- max-age:表示的是从服务器将文档传来之时起,可以认为此 文档处于新鲜状态的秒数
剩下的都是缓存校验字段。
这些字段都是根据修改时间来判断文件是否有变动:
- last-modified
- if-modified-since: last-modified-value
- if-unmodified-since: last-modified-value
只根据修改时间来判断会有问题:如果在服务器上,一个资源被修改了,但其实际内容根本没发生改变,会因为last-modified时间匹配不上而返回了整个实体给客户端(即使客户端缓存里有个一模一样的资源)
为了解决这个问题,推出了etag实体首部字段。服务器会通过某种算法,给资源计算得出一个唯一标志符(比如md5标志),在把资源响应给客户端的时候,会在实体首部加上“etag: 唯一标识符”一起返回给客户端。比如:etag: "5d8c72a5edda8d6a:3239"
如果服务器发现etag匹配不上,那么直接以常规get 200回包形式将新的资源(当然也包括了新的etag)发给客户端;如果etag是一致的,则直接返回304知会客户端直接使用本地缓存即可。
那么客户端是如何把标记在资源上的 etag 传回给服务器的呢?请求报文中有两个首部字段可以带上 etag 值:
if-none-match: etag-value
if-match: etag-value
需要注意的是,如果资源是走分布式服务器(比如cdn)存储的情况,需要这些服务器上计算etag唯一值的算法保持一致,才不会导致明明同一个文件,在服务器a和服务器b上生成的etag却不一样。
附上参考链接:,以及《http权威指南》
上一篇: monkeyrunner(草稿)