Skip to content

HTTP 缓存

基于 age 的缓存

基于 age 的缓存可以分为 Expires: <xxx>Cache-Controll: max-age=<xxx>

Expires 给出响应的过期时间;而 max-age 给出响应的生存时间。

如果 Expiresmax-age 同时存在,则以 max-age 为准。

Vary

区分不同的响应主要通过 URL ,但是我们可以通过设置 Vary 字段增加不同的条件。

如果设置了 Vary: Accept-Language 头部,那么缓存服务器还会根据请求头中的 Accept-Language 字段来区分不同的响应。

验证 / Validation

过时的响应不会立即丢弃。HTTP 有一种机制,可以通过询问服务器将过时的响应转换为新的响应。这称为验证,有时也叫重新验证。

验证是使用包含 If-Modified-Since or If-None-Match 请求标头的条件请求完成的。

当响应变得过时,并且无法重用缓存。因此,下面的请求显示了一个客户端发送带有 If-Modified-Since 请求标头的请求,以询问服务器自指定时间以来是否进行了任何更改。

If-Modified-Since 和 Last-Modified

http
GET /index.html HTTP/1.1
Host: example.com
Accept: text/html
If-Modified-Since: Tue, 22 Feb 2022 22:00:00 GMT

如果内容自指定时间以来未发生更改,服务器将进行 304 Not Modified 响应。

http
HTTP/1.1 304 Not Modified
Content-Type: text/html
Date: Tue, 22 Feb 2022 23:22:22 GMT
Last-Modified: Tue, 22 Feb 2022 22:00:00 GMT
Cache-Control: max-age=3600

ETag 和 If-None-Match

ETag 存在于响应的 HTTP 头部字段中。

HTTP 协议没有规定 ETag 值的生成方式,但通常使用文件的正文哈希值或者版本号。

If-None-Match 存在于请求的 HTTP 头部字段中。

http
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT
ETag: "33a64df5"
Cache-Control: max-age=3600

如果该响应已过时,则客户端将获取缓存响应的 ETag 响应标头的值,并将其放入 If-None-Match 请求标头中,以询问服务器是否已修改资源:

http
GET /index.html HTTP/1.1
Host: example.com
Accept: text/html
If-None-Match: "33a64df5"

如果服务器为请求的资源确定的 ETag 标头值与请求中的 If-None-Match 值相同,则服务器将返回 304 Not Modified

但是,如果服务器确定请求的资源现在应该具有不同的 ETag 值,则服务器将改为使用 200 OK 最新版本的资源进行响应。

强制验证 / Force Validation

通过将 Last-ModifiedCache-Controll: no-cache 放入响应头部字段中,可以让客户端每次都请求服务器,如果资源未更新则返回 304 Not Modified,否则改为使用 200 OK 最新版本的资源进行响应。

不缓存

通过将 Cache-Control: no-store 放入响应头部字段中,可以防止客户端缓存响应。