Chrome&Expires Header - 图像缓存

Ben*_*ton 2 tomcat caching google-chrome http

我有一个包含几百个小图像的Web应用程序,并且在加载时表现非常糟糕.

为了解决这个问题,我想在浏览器中缓存静态文件.

在Tomcat 7上使用servlet过滤器,我现在在静态文件上正确设置了expires标头,并且可以看到它返回给Chrome:

Accept-Ranges:bytes
Cache-Control:max-age=3600
Content-Length:40284
Content-Type:text/css
Date:Sat, 14 Apr 2012 09:37:04 GMT
ETag:W/"40284-1333964814000"
**Expires:Sat, 14 Apr 2012 10:37:05 GMT**
Last-Modified:Mon, 09 Apr 2012 09:46:54 GMT
Server:Apache-Coyote/1.1
Run Code Online (Sandbox Code Playgroud)

但是,我注意到Chrome仍然在重新加载时为每个静态资源进行服务器往返,发送if-modified标头并从Tomcat获取正确的304 Not Modified响应.

有没有办法让Chrome在服务器真正通过到期之前避免这些100多个请求到服务器?

tus*_*ath 9

有3种加载页面的方法 -

  1. 将url放在地址栏中并按Enter键,这相当于从超链接导航(默认浏览行为).这将遵循Expires标头,并将首先检查静态内容的缓存是否有效,然后如果Expires标头时间是将来它将直接从缓存加载它.在这种情况下,浏览器根本不会向服务器发出任何请求.如果缓存的内容无效,它将向服务器发出请求.

  2. 按f5刷新页面.这基本上会向服务器发送if-modified标头并验证内容是否已更改.如果它已经改变,你会得到200响应,否则304响应.在这两种情况下,在从服务器收到响应之前,图像不会加载到页面上.

  3. 按ctrl + f5将强制清除所有缓存并重新加载所有图像.它不会花时间验证图像是否已使用标题更改.

我想你期待的行为是第一种.您应该关注的唯一事情是您加载页面的方式.通常人们不会按f5或ctrl + f5,因此每次都不会重新验证静态内容.它将强制清除缓存并重新加载页面上的每个静态项.

简而言之,请记住 - 通过在地址栏中输入来重新加载页面.浏览器将遵循您提供的标头.这不是特定于chrome,它是W3C标准.