如何让浏览器停止缓存GWT nocache.js

jfr*_*z42 10 gwt lighttpd browser-cache

我正在使用GWT开发一个Web应用程序,app.nocache.js即使Web服务器发送了该文件的新副本,我也看到了在浏览器中缓存文件的疯狂问题!

我正在使用Eclipse来编译应用程序,它在开发模式下工作.为了测试生产模式,我有一台虚拟机(Oracle VirtualBox),在我的主机(Windows 7)上运行Ubuntu客户操作系统.我在VM中运行lighttpd Web服务器.VM正在共享我项目的war目录,并且Web服务器正在为此目录提供服务.

我使用Chrome作为浏览器,但在Firefox中也是如此.

这是场景:

  • 该应用的网页为空白.Accorind对Chrome的"Inspect Element"工具,因为它正在尝试获取6E89D5C912DD8F3F806083C8AA626B83.cache.html,它不存在(404 not found).
  • 我查看war目录,果然,该文件不存在.
  • app.nocache.js浏览器重新装入从Web服务器(200 OK),因为在服务器上的文件比浏览器缓存更新.我验证了服务器返回的新文件的文件大小和时间戳是正确的.(这是Chrome报告服务器的HTTP响应的信息)
  • 但是,如果我打开app.nocache.js浏览器,javascript就是指6E89D5C912DD8F3F806083C8AA626B83.cache.html!也就是说,即使Web服务器发送了新的app.nocache.js,浏览器似乎也忽略了它并继续使用其缓存副本!

  • 转到Google-> Eclipse中的GWT Compile.重新编译整个事情.

  • 在war目录中验证是否app.nocache.js被覆盖并具有新的时间戳.
  • 从Chrome重新加载页面并再次验证服务器是否向该服务器发送了200 OK响应app.nocache.js.
  • 浏览器再次尝试加载6E89D5C912DD8F3F806083C8AA626B83.cache.html并失败.浏览器仍在使用旧的缓存副本app.nocache.js.
  • 绝对肯定在战争目录中没有任何指称6E89D5C912DD8F3F806083C8AA626B83.cache.html(通过find和grep)

出了什么问题?为什么nocache.js即使服务器向其发送新副本,浏览器也会缓存此文件?


以下是在浏览器中单击重新加载时HTTP请求/响应标头的副本.在此跟踪中,自上次GET以来尚未重新编译服务器内容(但请注意,nocache.js的缓存版本仍然是错误的!):

Request URL:http://192.168.2.4/xbts_ui/xbts_ui.nocache.js
Request Method:GET
Status Code:304 Not Modified
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:192.168.2.4
If-Modified-Since:Thu, 25 Oct 2012 17:55:26 GMT
If-None-Match:"2881105249"
Referer:http://192.168.2.4/XBTS_ui.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4
Response Headersview source
Accept-Ranges:bytes
Content-Type:text/javascript
Date:Thu, 25 Oct 2012 20:27:55 GMT
ETag:"2881105249"
Last-Modified:Thu, 25 Oct 2012 17:55:26 GMT
Server:lighttpd/1.4.31
Run Code Online (Sandbox Code Playgroud)

Man*_*ino 5

避免浏览器缓存的最佳方法是设置到现在的到期时间并添加max-age = 0和必须重新验证控件.

这是我与apache-httpd一起使用的配置

ExpiresActive on
<LocationMatch "nocache">
   ExpiresDefault "now"
   Header set Cache-Control "public, max-age=0, must-revalidate"
</LocationMatch>
<LocationMatch "\.cache\.">
   ExpiresDefault "now plus 1 year"
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

你应该为lighthttpd配置

server.modules = (
    "mod_expire",
    "mod_setenv",
)
...
$HTTP["url"] =~ "\.nocache\." {
  setenv.add-response-header = ( "Cache-Control" => "public, max-age=0, must-revalidate" )
  expire.url = ( "" => "access plus 0 days" )
}

$HTTP["url"] =~ "\.cache\." {
  expire.url = ( "" => "access plus 1 years" )
}
Run Code Online (Sandbox Code Playgroud)


aws*_*ome 5

我们遇到了类似的问题.我们发现nocache.js的时间戳没有用gwt编译更新,所以不得不在构建时触摸该文件.然后我们也应用了@ManoloCarrascoMoñino的修复程序.我写了一篇关于这个问题的博客.http://programtalk.com/java/gwt-nocachejs-cached-by-browser/

我们正在使用GWT的2.7版本,评论也指出.