动态资源缓存
除了 if-modified-since 请求标头之外,ETag 标头有时还用于动态资源,以判断代码或者应用程序本身是否已更改。
对底层代码的更改有时会导致资源被修改,在这种情况下可能需要强制重新下载资源。
服务器可能采用的另一个优化是动态资源的服务器端缓存。
一些 CMS 系统会将此作为内置功能提供。
缓存静态文件
静态文件的缓存通常由 HTTP 服务器自动控制,而动态资源需要以编程方式控制。
如果静态文件未更改,服务器通常会以 HTTP 304 响应代码进行响应。
发送 304 Not Modified Header 是为了告诉客户端,自客户端上次下载资源以来,该资源尚未被修改。
当资源可缓存时,服务器通常会使用最后修改的标头进行响应。
客户端将存储此标头的副本,然后在后续请求中将其传送回服务器。
这是在 if-modified-since 请求标头中完成的。
缓存对于降低客户端和服务器的带宽使用很有用,并且还可以让服务器节省其他资源,尤其是在动态页面上使用时,因为服务器不必重新构建整个资源。
相反,会发送 304 响应代码。
如果资源支持缓存,通常浏览器会将其保存在本地缓存中。
然后,对于相同资源的下一个请求,浏览器将发送一个 if-modified-since 请求头,询问服务器资源是否发生了变化。
这个请求头允许服务器通过比较 if-modified-since 和资源的当前时间戳来检查客户端缓存的资源版本是否仍然是最新的。
如果没有任何变化,将传递 304 Not Modified,告诉浏览器从缓存加载资源。
然后服务器退出而不发送响应正文。
下面是一个 HTTP GET 请求,由浏览器执行:
GET /http-304-not-modified HTTP/1.1 Host: onitroad.com
响应可能如下所示:
HTTP/1.1 304 Not Modified
传递 304 响应时,不应将响应正文与标头一起发送。