【转载】掌握 HTTP 缓存——从请求到响应过程的一切(上)

简介: 作者:Ulrich Kautz 编译:胡子大哈翻译原文:http://huziketang.com/blog/posts/detail?postId=58b77935204d50674934c3ad 英文原文:Mastering HTTP Caching - from request to res...

作者:Ulrich Kautz 
编译:胡子大哈

翻译原文:http://huziketang.com/blog/posts/detail?postId=58b77935204d50674934c3ad 
英文原文:Mastering HTTP Caching - from request to response and everything

转载请注明出处,保留原文链接以及作者信息

学习笔记


HTPP 响应缓存头:

1、新版本指的是 HTTP/1.1

2、而旧版本指的是 HTTP/1.0

 

ETag:它是文档版本的标识符


 通常是内容的 MD5 值,不过它也可以包含其他内容,代表的是文档的版本/日期,如: 1.0 或者 2017-02-27。这里注意一点是,它必须用双引号括起来,如:ETag: "d3b07384d113edec49eaa6238ad5ff00"。

客户端请求了http://doc.tinywan.com:8038/cache2.txt,接着服务端返回了如下的响应内容:

第一次访问:

在响应里面,有两个有意思的头标识:

【1】一个是 ETag,内容的 MD5值。

【2】一个是 Last-Modified,这是 cache2.txt 文件最后一次被修改的时间。

这里就是二次验证起作用的地方:当客户端在很短的时间内再次访问上面的 URL,客户端浏览器会使用 If-* 请求头。如 If-None-Match 检查 ETag 的内容是否有改变。也就是说,如果 ETag 发生变化,客户端接收到的一个完整的新响应;如果 ETag 没变化,客户端接收到的是一个表明内容没变化的标识。

 第二次访问:

正如上面所展示的,这次服务器的响应里面不是 200 ok,而是304 Not Modified,这就是说它略过包体部分,让客户端直接去自己的缓存里拿数据。

我们修改cache2.txt文件

注意:以上红线划出来的地方,已经发生变化了

在处理上面那个cache2.txt 静态文件的例子时,客户端还可以使用 If-Modified-Since:Sun, 24 Sep 2017 05:27:44 GMT 来达到同样的效果(返回 304 响应)。这对于静态文件来说也很好用,因为响应头中的 Last-Modified 标识是根据服务器磁盘上的“更改时间戳”自动生成的。然而,“更改时间戳”对于动态文件通常没什么用,因为动态生成文件频繁更新,时间戳很难确定。我们都知道,你最想缓存起来的是内容,生成内容的代价是最大的,所以 ETag 头是更好的选择。

 Cache-Control头


 

Cache-Control 头相对来讲难一些。两个原因:

第一,Cache-Control 既可以用于请求头,也可以用于响应头。本文中着重讨论响应头,因为这是开发者所必须要掌握的。

第二,它控制着两个缓存:本地缓存(又称私有缓存)和共享缓存。

本地缓存,是指在客户端本地机器中的缓存。站在开发者的角度,它并不完全受你的控制,通常浏览器会自己决定是否把某些内容放到缓存中,这意味着:不要依赖于本地缓存。用户也可能在关闭浏览器的时候清理所有缓存,而你并不知道有这样的操作。除非你监测到了某个用户的流量不断上涨,导致缓存内容迅速失效,这时候你才会意识到。

共享缓存也就是本文所介绍的:处于客户端和服务器之间的缓存。即 CDN。你对共享缓存拥有绝对的控制,应该好好地利用它。

现在我们来用一些代码作为示例深入学习一下。

  1. Cache-Control: public max-age=3600
  2. Cache-Control: private immutable
  3. Cache-Control: no-cache
  4. Cache-Control: public max-age=3600 s-maxage=7200
  5. Cache-Control: public max-age=3600 proxy-revalidate

首先是缓冲能力,它关注的是缓存到什么地方,和是否应该被缓存。他的几个重要的属性是:

  • private表示它只应该存在本地缓存;
  • public表示它既可以存在共享缓存,也可以被存在本地缓存;
  • no-cache表示不论是本地缓存还是共享缓存,在使用它以前必须用缓存里的值来重新验证;
  • no-store表示不允许被缓存。

第二个是过期时间,很显然它关注的是内容可以被缓存多久。它的几个重要的属性是:

  • max-age=<seconds>:设置缓存时间,设置单位为秒。本地缓存和共享缓存都可以;
  • s-maxage=<seconds>:覆盖 max-age 属性。只在共享缓存中起作用。

最后一个是二次验证,表示精细控制。它的几个重要属性是:

  • immutable表示文档是不能更改的。
  • must-revalidate表示客户端(浏览器)必须检查代理服务器上是否存在,即使它已经本地缓存了也要检查。
  • proxy-revalidata表示共享缓存(CDN)必须要检查源是否存在,即使已经有缓存。

通过上面的具体解释,现在再来描述上面 Cache-Control 的那段代码所表达的意思就好理解多了:

  1. 本地缓存和 CDN 缓存均缓存 1 小时;
  2. 不能缓存在 CDN,只能缓存在本地。并且一旦被缓存了,则不能被更新;
  3. 不能缓存。如果一定要缓存的话,确保对其进行了二次验证;
  4. 本地缓存 1 小时,CDN 上缓存 2 小时;
  5. 本地和 CDN 均缓存 1 小时。但是如果 CDN 收到请求,则尽管已经缓存了 1 小时,还是要检查源中文档是否已经被改变。

 

 

 

 

 

 

 

 


 

目录
相关文章
|
3月前
|
存储 缓存 API
HTTP 请求的响应头部字段 Cache-Control 的值为 no-store 是什么意思
HTTP 请求的响应头部字段 Cache-Control 的值为 no-store 是什么意思
60 0
|
5月前
|
网络协议
深入理解HTTP的基础知识:请求-响应过程解析
在当今数字化的世界中,理解HTTP协议的基础知识变得至关重要。本文将带您深入探索HTTP的核心概念和请求-响应的过程。HTTP是一种用于在计算机之间传输超文本数据的协议,它不仅定义了数据交换的规则和格式,还为不同的应用程序提供了通信和交换信息的能力。通过深入了解HTTP的请求-响应过程,我们将更好地理解网络通信的基本原理,为构建和优化网络应用打下坚实的基础。
179 1
|
6月前
|
Web App开发 缓存 安全
关于 HTTP 响应头字段 Strict-Transport-Security
关于 HTTP 响应头字段 Strict-Transport-Security
89 0
|
6月前
|
Web App开发 存储 缓存
关于 HTTP 响应头部字段 X-Cache-Akamai
关于 HTTP 响应头部字段 X-Cache-Akamai
77 0
|
6月前
|
开发框架 安全 .NET
HTTP 请求的响应头部字段里的 X-powered-by 字段
HTTP 请求的响应头部字段里的 X-powered-by 字段
146 0
|
30天前
|
网络协议 网络安全 API
Qt 网络编程之美:探索 URL、HTTP、服务发现与请求响应
Qt 网络编程之美:探索 URL、HTTP、服务发现与请求响应
43 1
|
2月前
|
XML JSON 中间件
|
2月前
|
Java
【JavaEE初阶】 HTTP响应报文
【JavaEE初阶】 HTTP响应报文
|
2月前
|
数据采集 JSON Java
HttpClient:HTTP GET请求的服务器响应输出
HttpClient:HTTP GET请求的服务器响应输出
|
3月前
|
缓存 负载均衡
常见的HTTP响应状态码
常见的HTTP响应状态码
74 0