10

根据 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

4 回答 4

40

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

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

于 2012-09-05T16:29:18.917 回答
5

对我来说,问题是Last-Modified我发送的响应中的日期不完全是 RFC 1123。Chrome 不介意;它很高兴地将我格式错误的时间戳发送回If-Modified-Since标题中。然而,Firefox 悄悄地忽略了它。

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

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

于 2014-11-18T11:58:56.263 回答
2

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

但是,当使用“ctrl+r”请求重新加载时,它发送了两个标头,但资源仍然被“ 200 OK ”重新加载,即使它们应该返回“ 304 Not modified

经过一番跟踪,我发现这是由于 apache 2.4.25 deflate 模块造成的。如果资源被压缩,它们实际上不会被缓存(也就是说,它们将在下次访问时重新加载)。当进一步研究它时,事实证明这是由于使用 deflate 时的 ETag 处理。

所以对我来说最合理的组合是使用“ FileETag None ”,现在当我执行“ctrl-r”时,即使是压缩文档,我也能正确得到“304”。

令人惊讶的是,即使在那之后它仍然显示绿色“ 200 OK ”,表示完全检索 od CSS 和 JS(在详细的“请求标头”面板中没有“ If-Modified-Since ”),这让我抓狂,直到我发现这个专栏有时是FAKED(还有另一列称为“ Transferred ”,如果它说“ cached ”而不是字节数,这意味着 Firefox 实际上是从内部缓存中获取值,而不是从它显示的网络“200 OK”请求中获取的。检查服务器端的 access_log 确认没有网络活动,所以那部分只是糟糕的 UI)

于 2019-01-30T03:23:07.690 回答
0

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

这更加令人费解,因为此时 safari 仍然可以正确缓存请求,而 firefox 至少可以将请求缓存在内存中。

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

于 2016-11-04T14:14:04.980 回答