我正在使用GWT开发Web应用程序,但在浏览器中看到了一个奇怪的问题,即使Web服务器发送了新文件的副本,浏览器仍然缓存了
为什么浏览器会缓存这个
app.nocache.js
文件。我使用Eclipse编译该应用程序,在dev模式下工作正常。为了测试生产模式,我有一个虚拟机(Oracle VirtualBox),其Ubuntu客户端OS在我的主机(Windows 7)上运行。我在VM中使用lighttpd web服务器。VM共享我的项目war目录,并由Web服务器提供此目录。我正在使用Chrome浏览器,但是Firefox也会出现同样的问题。这是情景:1.应用程序的Web页面是空白的,因为它正在尝试获取不存在的6E89D5C912DD8F3F806083C8AA626B83.cache.html
文件(404未找到
)。2.我检查了war目录,确实没有该文件。3.浏览器中的app.nocache.js
已从Web服务器重新加载(200 OK),因为服务器上的文件比浏览器缓存的文件更新。我验证了服务器返回的新文件的文件大小和时间戳是否正确。(这是Chrome报告的有关服务器HTTP响应的信息)4.但是,如果我在浏览器中打开app.nocache.js
,则JavaScript引用的是6E89D5C912DD8F3F806083C8AA626B83.cache.html
!!!也就是说,即使Web服务器发送了新的app.nocache.js
,浏览器似乎会忽略它并继续使用其缓存的副本!5.在Eclipse中转到Google-> GWT Compile。重新编译整个内容。6.验证war目录中app.nocache.js
已被覆盖并具有新的时间戳。7.从Chrome重新加载页面,并再次验证服务器是否向app.nocache.js
发送了200 OK响应。8.浏览器再次尝试加载6E89D5C912DD8F3F806083C8AA626B83.cache.html
,但失败了。浏览器仍在使用旧的缓存副本app.nocache.js
。9.确保在war目录中没有任何东西引用6E89D5C912DD8F3F806083C8AA626B83.cache.html
(通过查找和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