问题描述

关于 CSS 和浏览器的快速问题。我试着搜索 SO,发现一些类似的帖子,但没有确定。

我在我的 Web 项目中使用一个或两个 CSS 文件。这些在我的网页的 HEAD 中引用。一旦我打到我的一个页面,CSS 是否被缓存,这样每个请求都不是 re-downloaded?但愿如此。 IE,Firefox 和 Safari 的处理方式有所不同吗?如果浏览器关闭,在打开新的浏览器实例时,首次访问时是否刷新 CSS?

最佳解决方案

您的文件可能会被缓存 – 但它取决于…

不同的浏览器具有稍微不同的行为 – 最明显的是处理从服务器发出的模糊/有限的缓存头。如果你发出一个清晰的信号,浏览器就会服从,几乎所有的时间。

目前最大的差异是在不同的 Web 服务器和应用服务器的默认缓存配置中。

一些 (例如 Apache) 可能会使用 HTTP 标头提供已知的静态文件类型,鼓励浏览器对其进行缓存,而其他服务器可能会在每个响应中发送 no-cache 命令 – 无论文件类型如何。

所以,首先,看一些优秀的 HTTP caching tutorials 在那里。 HTTP Caching & Cache-Busting for Content Publishers 是我真正的开眼界:-)

下一步安装和解决 FirebugLive HTTP Headers add-on,以找出您的服务器实际发送的头。

然后阅读您的 Web 服务器文档,以了解如何调整他们完美 (或者说你的系统管理员为你做) 。

关于浏览器重新启动时会发生什么,这取决于浏览器和用户配置。

作为经验法则,希望浏览器在每次重新启动后更有可能与服务器签入,以查看是否有任何更改 (请参阅 If-Last-ModifiedIf-None-Match) 。

如果正确配置服务器,则应该能够返回一个 super-short 304 Not Modified(花费很少的带宽),之后浏览器会正常使用缓存。

次佳解决方案

到你的问题的第一部分 – 是的,浏览器缓存 css 文件 (如果浏览器的配置没有禁用) 。许多浏览器具有组合键以重新加载没有缓存的页面。如果您对 css 进行了更改,并希望用户立即查看它们,而不是等待下次浏览器重新加载文件而不进行缓存时,您可以通过向 URL 添加一些参数来更改 CSS irir 的服务方式,如下所示:

/style.css?modified=20012009

第三种解决方案

它确实取决于发送与 CSS 文件的 HTTP 标头作为以前的答案状态 – 只要你没有附加任何缓存有效的东西到 href 。例如

<link href="/stylesheets/mycss.css?some_var_to_bust_cache=24312345" rel="stylesheet" type="text/css" />

默认情况下,一些框架 (例如 rails) 将它们放入。

但是,如果您收到类似 firebugfiddler 的内容,您可以在每个请求中看到您的浏览器正在下载什么 – 这对于找出您的浏览器正在做什么尤其有用,而不仅仅是它应该做什么。

所有浏览器都应该以相同的方式遵循缓存标头,除非配置为忽略它们 (但必定是异常)

第四种方案

可能值得注意的是,IE 不会使用 @import 方法缓存由其他 css 文件调用的 css 文件。所以,例如,如果你的 html 页面链接到”master.css”,它通过 @import 拉入”reset.css”,那么 reset.css 不会被 IE 缓存。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛