关于过期标题的问题

时间:2011-05-02 17:45:38

标签: http caching glassfish

  1. 如果响应中没有设置过期的http标头,这对浏览器意味着什么?
  2. 在Glassfish v3中,如何为在docroot下部署的静态资源配置expires标头而不是war文件?
  3. 我注意到Glassfish似乎默认设置了ETag标头。真的吗? 我想在这里实现的最终目标是设置一个远期未来的过期标题,但每当部署新版本的css,js,图像文件时,能够告诉浏览器“有新东西”。
  4. 非常感谢任何建议。

5 个答案:

答案 0 :(得分:5)

阅读http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx了解背景信息。

  1. 如果您未指定新鲜度,则某些浏览器会每次都进行检查。有些人会每次检查一次。大多数最新版本的浏览器将尝试计算自上次修改日期以来10%的启发式到期时间(如果提供)。如果没有,他们将每次或每次会议检查一次。
  2. 不知道。
  3. 这不是HTTP过期的方式 - 浏览器不会神奇地“知道”新内容出现在服务器上(怎么可能?)。如果要更改在客户端上缓存的内容,则需要更改URL,以便忽略旧的缓存内容。

答案 1 :(得分:2)

对于服务器响应标头中未提供的expires,请参见此处的§14.21: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

即使提供,expires也会被max-age指令覆盖,因此如果未提供expires,则会使用max-age。如果没有提供,请参见§13.2.4: http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.2.4 基本上它表示客户端可以在不确定的时间段内设置缓存,而不是始终如一。

要解决您的问题,您可能会说静态元素永不过期,并为HTML文档中包含的元素添加过期时间。要做到这一点,请看这里: http://www.tipsandtricks-hq.com/how-to-add-far-future-expires-headers-to-your-wordpress-site-1533

引用:“要为图片添加过期标头,CSS,javascript文件会将以下内容添加到您的.htaccess文件中

过期标题

> <FilesMatch "\.(ico|jpg|jpeg|png|gif|js|css|swf)$">
> ExpiresDefault "access plus 2 hours"
> </FilesMatch>

或过期图片标题

> ExpiresActive On 
> ExpiresDefault A0
> ExpiresByType image/gif A2592000

[...] 请记住,当您使用expires标头时,文件将缓存在浏览器中,直到它过期,因此请勿在经常更改的文件上使用此文件。如果您更改/更新远期到期的文件(例如CSS或javascript文件),那么您应该重命名该文件并使用重命名的版本,以便浏览器不会获取旧文件。“

答案 2 :(得分:1)

就你的第二个问题而言,我觉得这个资源很有意思:

http://blogs.oracle.com/cwebster/entry/caching_static_resources_in_glassfish

这里提出的解决方案不仅仅是配置,还需要实现和使用过滤器。

答案 3 :(得分:0)

无论是否设置了Expires标头,执行的实际操作都依赖于实现。这只是对浏览器的建议,任何给定浏览器的任何给定版本都可以随意忽略它。

对于问题3,您可以附加一个查询字符串,该字符串是版本号,最后修改日期(如果您的样式表或javascript每天更改一次,您没有正确使用测试或登台),或者文件的当前校验和。例如,您可以使用

代替site.css
<link rel="stylesheet" href="site.css?lastmodified=20110605">

<link rel="stylesheet"
  href="site.css?sha1sum=da39a3ee5e6b4b0d3255bfef95601890afd80709">

答案 4 :(得分:0)

这不是一个完整的答案,但在答案中比在评论中更容易格式化输出。

  1. 如果没有“expires”标头而没有其他缓存标头,则浏览器不应缓存 内容。但是,如果您有Last-Modified标头,那么浏览器不需要expires标头来缓存内容并知道它何时过期。
  2. 不知道
  3. expires标题是不需要来缓存页面,当您知道可能的到期日期时(例如,如果它是每日),它实际上意味着动态内容生成图)。文档过期的方法有很多种。例如,如果指定了文档Last-Modified标题并且内容长度已知,则浏览器可以缓存页面,下次可以使用If-Modified-Since标题,这将导致304 Not Modified,因此浏览器可以显示缓存的内容。因此,如果Last-Modified不用担心 - 浏览器将始终显示新版本(极少数例外)