2012-04-14 58 views
2

我有一个包含几百个小图像的web应用程序,并且在加载时表现相当糟糕。Chrome和过期头 - 图像缓存

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

使用servlet filter on Tomcat 7,我现在设定的静态文件正确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 

然而,我注意到,Chrome仍然会做一个往返于服务器上重新加载每个静态资源,发送一个if-modified头并从Tomcat获得正确的304 Not Modified响应。

有没有什么办法让Chrome在服务器到期之前避免这100多个请求?

+0

这些图像是不断变化还是大部分保持不变? – abraham 2012-04-15 00:06:55

+0

一个类似的问题已经被问到:[Chrome - 为什么它发送如果修改,因为请求?](http://stackoverflow.com/questions/3934413/chrome-why-is-it-sending-if-modified-因为-请求)。不确定它实际上是否回答,但有一些想法在那里... – kevinjansz 2012-04-15 23:07:50

回答

2

当您测试时请小心。我注意到,在Chrome版本20中,如果我点击F5重新加载页面,那么在网络面板中,我会看到新的请求。 如果我将光标放在标题栏上,在当前页面的url之后,并按下回车键,我会从缓存中获取资源,并将标题设置为缓存。

也是一个很好的阅读:

http://betterexplained.com/articles/how-to-optimize-your-site-with-http-caching/

9

有加载页面的3种方式 -

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

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

  3. 按ctrl + f5将强制清除所有缓存并重新载入所有图像。它不会花时间检验图像是否已经改变或者没有使用标题。

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

总之只要记住 - 在地址栏中按Enter键重新加载页面。浏览器将遵循您提供的标题。这不是针对Chrome,它是W3C标准。

0

假设您排除了已经提出的各种疑难问题,我发现Google Chrome可以忽略Cache-Control指令,除非它包含public,并且它必须是第一个。例如:

Cache-Control: public, max-age=3600 

在我的实验我也删除的ETag来自服务器的响应,这样可能是一个因素,但我没有回去检查。