为什么Firefox不发送If-Modified-Since标头?

时间:2012-09-05 16:07:42

标签: http firefox http-headers browser-cache

根据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标头。

4 个答案:

答案 0 :(得分:33)

好吧,我觉得自己像是一个doofus,但我决定把我的骄傲放在一边,而不是仅仅删除这个问题,告诉解决方案是什么,万一其他人做过同样的事情......

曾几何时,为了测试某些东西,我在Firefox中关闭了缓存。我把它重新打开了,现在它正在发送标题。

答案 1 :(得分:2)

对我而言,问题原因是我发送的回复中的Last-Modified日期并不完全是RFC 1123.Chrome并不介意;它很高兴地将我的格式错误的时间戳发回If-Modified-Since标题。然而,Firefox却默默地忽略了它。

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

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

答案 2 :(得分:0)

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

这是令人费解的,因为那时的safari仍能正确缓存请求,而firefox因为至少可以将请求缓存在内存中。

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

答案 3 :(得分:0)

对我来说,这是Firefox(ESR 60.4.0)没有发送“ If-Modified-Since ”或“ If-None-Match ”标头当我从地址栏加载网站时获得一些资源(例如CSS,JS)。

但是,当请求使用“ ctrl + r”重新加载时,它正在发送两个标头,但是仍然使用“ 200 OK ”重新加载了资源,即使它们应该已经返回了“ 304”未修改

经过一些跟踪,我发现这是由于Apache 2.4.25 deflate模块引起的。如果资源被压缩,则它们实际上将不会被缓存(也就是说,它们将在下次访问时重新加载)。 When looking more into it,原来是由于使用deflate时的ETag处理。

所以对我来说,最合理的选择是使用“ FileETag None ”,现在即使执行“ ctrl-r”,即使对于压缩文档,我也可以正确获得“ 304”。

令人惊讶的是,即使在此之后,它仍然显示绿色“ 200 OK ”,表示已完全检索CSS和JS(详细信息中没有“ If-Modified-Since ”请求标头”面板)使我发疯,直到我发现此列有时被 FAKED (伪造)(还有另一列称为“ Transferred ”,如果它显示为“ < “ strong> cached ”(而不是字节数),这意味着Firefox实际上是从内部缓存而不是从网络显示的“ 200 OK”请求中获取了该值。在服务器端检查access_log确认没有网络活动,然后,因此该部分只是不良的UI)