📌  相关文章
📜  响应不再有效:太旧或以前使用过 (1)

📅  最后修改于: 2023-12-03 15:07:31.885000             🧑  作者: Mango

响应不再有效:太旧或以前使用过

介绍

当我们从服务器请求资源时,服务器会返回响应。这个响应包含了状态码和可以被浏览器解析和显示的响应内容。但是,有时候在请求资源的过程中,我们可能会遇到这样的错误提示:

响应不再有效:太旧或以前使用过

这个错误提示的意思是,我们请求的资源在服务端被缓存过,但是这个缓存已经过期或者被删除了。也就是说,我们再次请求这个资源时,服务器无法返回最新的数据,就会导致这个错误的出现。

解决方法
1. 强制缓存

强制缓存指的是在客户端缓存请求的数据,并在合法期限内不向服务器发出请求。当我们再次请求这个资源时,浏览器会直接从缓存中读取数据,而不用重新向服务端请求。这样可以减少请求次数,加快页面加载速度。

要设置强制缓存,可以在服务端返回的响应头中添加以下两个属性:

  • Cache-Control
  • Expires

Cache-Control 指定资源的缓存规则,可以设置的值包括:

  • public:所有用户和代理服务器都可以缓存该内容
  • private:只有用户的浏览器可以缓存该内容
  • no-cache:不缓存内容,每次都需要向服务端请求
  • max-age:指定最长缓存时间,单位是秒

例如,在返回一个 html 页面时可以这样设置:

Cache-Control: max-age=3600
Expires: Thu, 17 Sep 2020 10:00:00 GMT

这表示该 html 页面将被缓存 1 小时,过期时间为 2020 年 9 月 17 日 10 点。

注意:Cache-Control 和 Expires 两者只要设置了一个就可以了,Cache-Control 的优先级更高一些。

2. 协商缓存

协商缓存是指客户端通过向服务端发送一些验证信息来询问该资源是否有更新。

在协商缓存的请求中,客户端会在请求头中携带一个 If-Modified-Since 字段,表示上次缓存该资源时获取到的最后修改时间。服务端会把这个时间和资源的最后修改时间进行比对,如果客户端缓存的资源比服务端最新的资源还旧,就会返回状态码 304,告诉客户端可以继续使用缓存的资源,否则就会返回最新的资源。

除了 If-Modified-Since 之外,还有一个 If-None-Match 字段,表示上次缓存该资源时服务器返回的一个唯一标识符。这个标识符可以是资源的 MD5 或者其他哈希值。当服务器验证客户端缓存的资源是否过期时,会同时比对这个唯一标识符是否发生变化。如果唯一标识符没有发生变化,服务器同样会返回 304 状态码。

3. 避免缓存出现问题

有时我们会遇到缓存出现问题的情况,比如客户端清空了缓存,但是服务端缓存的资源还是旧的,这样就会导致返回 响应不再有效:太旧或以前使用过 的错误。

为了避免这个问题出现,我们可以在服务端设置缓存策略:当服务端缓存过期或者资源发生新变化时,及时清空缓存。这样客户端再次请求该资源时,就能够从服务端获取到最新的数据,避免出现缓存问题。

结论

在 Web 开发中,缓存是非常重要的一个概念。通过缓存,我们可以减少资源的请求次数,加快页面加载速度,提高用户体验。但是,我们也需要注意缓存出现问题的情况。如果出现 响应不再有效:太旧或以前使用过 的错误,可以通过强制缓存或者协商缓存来解决。同时,我们还需要及时清空服务端缓存,避免出现缓存问题。