📜  HTTP缓存(1)

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

HTTP缓存

概述

HTTP缓存是指在Web应用程序中对常用资源实施的机制,建立起缓存副本以减少访问资源的网络请求次数,从而加快Web页面的加载速度。HTTP缓存分为两种类型:浏览器缓存和服务端缓存。

浏览器缓存又分为强缓存和协商缓存。强缓存是指浏览器在请求资源时直接从本地缓存中获取,不会进行任何请求和响应。协商缓存是指浏览器在请求资源时会通过和服务端进行“协商”,根据服务端的响应(包含资源的最新修改时间或唯一标识符等信息)来判断是直接使用缓存还是重新请求。

服务端缓存是指服务端对响应资源进行的缓存,它可以减轻服务器端的压力,提高响应速度。

强缓存

强缓存是指当浏览器向服务器请求资源时,先判断本地是否有该资源的缓存副本,并且该副本是否过期,如果没有过期则直接使用本地缓存副本,不会发送请求到服务器,减少了网络开销。

强缓存通常是通过设置HTTP响应头中的Expires或Cache-Control来实现的。

Expires

Expires是HTTP/1.0中的一个header部分,它的值是一个日期,表示该资源的过期时间。缺点是客户端和服务端的时间可能不一致,导致缓存过期时间不准确,不利于缓存的管理和维护。

代码示例:

HTTP/1.0 200 OK
Expires: Wed, 21 Oct 2020 07:28:00 GMT
Content-Type: text/html
Cache-Control

Cache-Control是HTTP/1.1中的一个header部分,它用来控制缓存策略,常用的值有max-age和no-cache。

  • max-age:表示该资源的缓存有效时间,单位为秒。浏览器在请求该资源时,会先判断本地是否有对应的缓存副本,并且是否过期,如果未过期则使用本地缓存副本,如果已过期则向服务端发起请求。
  • no-cache:表示该资源需要在每次使用前确认是否更新,强制缓存不生效。

代码示例:

HTTP/1.1 200 OK
Cache-Control: max-age=3600
Content-Type: text/html
协商缓存

协商缓存是指浏览器向服务器请求资源时会带上缓存标识(包含资源的最新修改时间或唯一标识符等信息),服务端根据该标识来判断资源是否过期。如果过期,则返回资源的新版本;否则返回304 Not Modified,告诉浏览器使用本地缓存。

协商缓存通常是通过设置HTTP响应头中的Last-Modified和ETag来实现的。

Last-Modified

Last-Modified表示该资源的最后修改时间,服务端会将该值在响应头中返回给浏览器,浏览器再将该值在下一次请求时带给服务器,服务器根据该时间来判断资源是否过期。

代码示例:

HTTP/1.1 200 OK
Last-Modified: Wed, 21 Oct 2020 07:28:00 GMT
Content-Type: text/html
ETag

ETag是由服务器分配的资源唯一标识符,服务器会将该值在响应头中返回给浏览器,浏览器再将该值在下一次请求时带给服务器,服务器根据该标识符来判断资源是否过期。

代码示例:

HTTP/1.1 200 OK
ETag: "686897696a7c876b7e"
Content-Type: text/html
缓存控制

针对特定资源的缓存策略可以通过设置返回头来实现,如以下几种情况:

不缓存

可以通过设置响应头中的Cache-Control来实现不缓存的策略。

Cache-Control: no-store
缓存过期

可以通过设置Expires来让缓存在指定时间之后过期,也可以通过设置max-age控制缓存时间。

Expires: Wed, 21 Oct 2020 07:28:00 GMT
强制缓存

可以通过设置Cache-Control和Expires来实现强制缓存的策略。

Cache-Control: max-age=3600
Expires: Wed, 21 Oct 2020 07:28:00 GMT
循环缓存

可以通过设置响应头中的Vary来指定某些请求头作为缓存的依据,这样浏览器在匹配缓存时就会根据Vary指定的请求头来判断。

Vary: Accept-Encoding
总结

HTTP缓存是提高Web页面性能的重要手段,可以通过设置相应的HTTP响应头来实现不同的缓存策略,在实际开发中需要根据具体情况来选择适合的缓存策略。强缓存可以减少请求次数,但不利于更新资源;协商缓存可以更加精确地判断资源是否过期,但会增加服务器的负担。开发者需要在强缓存和协商缓存之间进行权衡,以提高用户体验和性能。