Cache-Control
Cache-Control: no-store, no-cache, max-age=0, must-revalidate, proxy-revalidate
Expires
Expires 标头使用明确的时间而不是通过指定经过的时间来指定缓存的生命周期。 如果 Expires 和 Cache-Control: max-age 都可用,则将 max-age 定义为首选。因此,由于 HTTP/1.1 已被广泛使用,无需特地提供 Expires。
If-Modified-Since/Last-Modified
服务器可以从操作系统的文件系统中获取修改时间,这对于提供静态文件的情况来说是比较容易做到的。但是,也存在一些问题;例如,时间格式复杂且难以解析,分布式服务器难以同步文件更新时间。 为了解决这些问题,ETag 响应标头被标准化作为替代方案。
ETag/If-None-Match
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT
ETag: "deadbeef"
Cache-Control: max-age=3600
<!doctype html>
…
GET /index.html HTTP/1.1
Host: example.com
Accept: text/html
If-None-Match: "deadbeef"
在评估如何使用 ETag 和 Last-Modified 时,请考虑以下几点:在缓存重新验证期间,如果 ETag 和 Last-Modified 都存在,则 ETag 优先。因此,如果你只考虑缓存,你可能会认为 Last-Modified 是不必要的。然而,Last-Modified 不仅仅对缓存有用;相反,它是一个标准的 HTTP 标头,内容管理 (CMS) 系统也使用它来显示上次修改时间,由爬虫调整爬取频率,以及用于其他各种目的。所以考虑到整个 HTTP 生态系统,最好同时提供 ETag 和 Last-Modified。
强制重新验证 no-cache
如果你不希望重复使用响应,而是希望始终从服务器获取最新内容,则可以使用 no-cache 指令强制验证。需要往服务端发送请求,不是不使用缓存
max-age=0 和 must-revalidate 的组合与 no-cache 具有相同的含义。
不使用缓存 no-store
no-cache 指令不会阻止响应的存储,而是阻止在没有重新验证的情况下重用响应。 如果你不希望将响应存储在任何缓存中,请使用 no-store。