为什么Firefox没有发送If Modified Since标头



根据Firebug,以下是第一次检索资源时的响应标头:

Accept-Ranges   bytes
Cache-Control   public, max-age=86400
Content-Language    en
Content-Length  232
Content-Location    http://localhost/myapp/cacheTest.html
Content-Type    text/html; charset=WINDOWS-1252
Date    Wed, 05 Sep 2012 15:59:31 GMT
Last-Modified   Tue, 01 May 2012 05:00:00 GMT
Server  Restlet-Framework/2.0.3
Vary    Accept-Charset, Accept-Encoding, Accept-Language, Accept

我点击离开并点击返回,下面是发送到服务器的请求头:

Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Connection  keep-alive
Host    localhost
Referer http://localhost/myapp/cacheTest2.html
User-Agent  Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0

因此,很自然,服务器不能像我想要的那样发送304,而是再次发送整个资源。

这发生在Firefox 14中,我认为这可能是一个错误,所以我升级了。但这种情况在Firefox 15中仍然存在。Chrome没有问题。

我试过使用和不使用"Expires"标头,这没有什么区别。Firefox只是拒绝发送If Modified Since标头。

好吧,我觉得自己像个傻瓜,但我决定把我的骄傲放在一边,不要只是删除这个问题,告诉我解决方案是什么,以防其他人也做过同样的事情。。。

从前,为了测试一些东西,我关闭了Firefox中的缓存。我把它重新打开,现在它正在发送标题。

对我来说,问题是我发送的响应中的Last-Modified日期并不完全是RFC 1123。Chrome并不介意;它很高兴地在If-Modified-Since报头中发送回了我的格式错误的时间戳。然而,火狐却不闻不问

我可以从你的标题中看出,这不是你的原因,但我无论如何都会发布这个答案,因为我花了一段时间才意识到这就是问题所在,也许有一天,其他人也会遇到同样的问题。

这是在Linux,FWIW(确切地说是Mint 17)下实现的,但我希望这两种浏览器在其他操作系统下都能以相同的方式运行。

对我来说,当我从地址栏加载网站时,Firefox(ESR 60.4.0)没有为某些资源(如CSS、JS)发送"If Modified Since"或"If None Match"标头。

然而,当请求用"ctrl+r"重新加载时,它发送了两个标头,但资源仍然用"200 OK"重新加载,即使它们本应返回"304未修改

经过一些跟踪,我发现这是由于apache2.4.25 deflate模块。如果资源被压缩,它们实际上不会被缓存(也就是说,它们将在下次访问时重新加载)。当深入研究时,发现这是由于使用deflate时的ETag处理。

因此,对我来说,最合理的拼凑是使用"FileETag None",现在即使是压缩文档,当我使用"ctrl-r"时,我也能正确地获得"304"。

令人惊讶的是,即使在那之后,它仍然显示绿色的"200 OK",表示CSS和JS的完全检索(在详细的"请求标题"面板中没有"If Modified Since),这让我疯了,直到我发现这个列有时是伪造的(还有一个列叫"已传输",如果它说的是"cached,而不是字节数,这意味着firefox实际上是从内部缓存而不是从网络"200 OK"获得值的请求显示。检查服务器端的access_log确认当时没有网络活动,因此部分只是糟糕的UI)

导致firefox不缓存请求的另一个原因是磁盘已满。至少在OSX上。

这是非常令人费解的,因为safari在这一点上仍然可以正确地缓存请求,而firefox至少可以将请求缓存在内存中。

清除缓存并在磁盘上腾出一些空间会有所帮助。

最新更新