【问题标题】:Browser Caching of CSS filesCSS文件的浏览器缓存
【发布时间】:2010-10-02 09:39:52
【问题描述】:

关于 CSS 和浏览器的快速问题。我尝试搜索 SO 并找到了一些类似的帖子,但没有确定的。

我在我的网络项目中使用一两个 CSS 文件。这些在我的网页的 HEAD 中被引用。一旦我点击了我的一个页面,CSS 是否会被缓存,以便不会在每个请求中重新下载?但愿如此。 IE、Firefox 和 Safari 的处理方式不同吗?如果浏览器关闭,当新的浏览器实例打开时,CSS是否会在第一次访问时刷新?

【问题讨论】:

  • 标题的“文件大小”部分有点误导,因为实际问题实际上根本不围绕文件大小。 “CSS 文件和浏览器缓存”或“CSS 文件的浏览器缓存”看起来要好得多……

标签: html css http caching browser


【解决方案1】:

您的文件可能会被缓存 - 但这取决于...

不同浏览器的行为略有不同 - 最明显的是在处理来自服务器的不明确/有限的缓存标头时。如果您发送一个明确的信号,浏览器几乎会一直服从。

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

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

...

所以,首先,阅读一些优秀的HTTP caching tutorialsHTTP Caching & Cache-Busting for Content Publishers 让我大开眼界:-)

接下来安装和摆弄FirebugLive HTTP Headers 插件,找出您的服务器实际发送的标头。

然后阅读您的网络服务器文档,了解如何将它们调整到完美(或让您的系统管理员为您做这件事)。

...

至于浏览器重启后会发生什么,取决于浏览器和用户配置。

根据经验,每次重新启动后浏览器都更有可能与服务器签入,以查看是否有任何变化(请参阅If-Last-ModifiedIf-None-Match)。

如果您正确配置您的服务器,它应该能够返回一个超短的304 Not Modified(占用很少的带宽),然后浏览器将正常使用缓存。

【讨论】:

  • Ctrl-K 是否已经向我们展示了“实时 http 标头”?为什么我们需要使用 Live HTTP Header 插件?
【解决方案2】:

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

/style.css?modified=20012009

【讨论】:

  • 天才! /Style.css?deployment={DeploymentId}
  • RFC 是否支持这种行为?
  • @Pacerier 是的,这是一种“受支持”的做事方式。由于浏览器只是将/style.css?modified=20012009 视为URL,因此相当于每次发布时都更改CSS 文件的名称。由于浏览器认为文件是新的,它不会尝试使用它的任何缓存版本。
  • @plowman,我的意思是是的,它在 wild 中工作,但是官方规定的 rfc 标准实际上支持这种行为吗?
  • @Pacerier - 对我来说看起来像是一个非常标准的 HTTP GET 参数。是什么让您认为它不会被支持?这里没什么特别的……
【解决方案3】:

它确实取决于与 CSS 文件一起发送的 HTTP 标头,正如前面的两个答案状态一样 - 只要您不将任何缓存清除内容附加到 href。例如

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

一些框架(例如rails)默认将这些放入。

但是,如果您收到 firebugfiddler 之类的信息,您可以准确地看到您的浏览器在每次请求时下载了什么 - 这对于了解您的浏览器正在在做什么特别有用,而不是它应该做的。

所有浏览器应该以同样的方式尊重缓存头,除非配置为忽略它们(但肯定会有例外)

【讨论】:

    【解决方案4】:

    值得注意的是,IE 不会缓存其他 css 文件使用 @import 方法调用的 css 文件。因此,例如,如果您的 html 页面链接到“master.css”,该“master.css”通过@import 拉入“reset.css”,则 IE 不会缓存 reset.css。

    【讨论】:

    • 这似乎是非常重要的一点。可以加个参考吗?
    • 这似乎不是真的,参见:link 看到此评论/答案:Murray | 2009 年 5 月 27 日上午 9:52 史蒂夫,我还听说使用 @import 时,浏览器可能不会缓存 css 文件,这与使用 .但我无法验证这一点。您是否知道从缓存的角度来看它是否真的很重要?如果是这样,这可能是避免@import 的另一个原因。史蒂夫苏德斯 | 2009 年 5 月 27 日下午 2:26 默里:我没听说过,我的测试中也没有。
    【解决方案5】:

    这取决于您与 CSS 文件一起发送的标头。检查您的服务器配置,因为您可能没有手动发送它们。 在 Google 上搜索“http 缓存”以了解您可以设置的不同缓存选项。 例如,您可以强制浏览器在每次加载文件时下载文件的新副本,或者您可以将文件缓存一周...

    【讨论】:

      【解决方案6】:

      除非你弄乱了你的服务器,否则它是被缓存的。所有浏览器都应该以相同的方式处理它。有些人(比如我)可能会将他们的浏览器配置为不缓存任何文件。关闭浏览器不会使缓存中的文件无效。但是,更改服务器上的文件会导致文件刷新。

      【讨论】:

      • 这大多是错误的。浏览器之间在缓存方面存在差异。一旦一个文件被缓存在客户端上,它就不会被再次下载,直到缓存(无论出于何种原因)过期,更改服务器上的文件不会有任何区别......
      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2014-02-03
      • 2011-05-29
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      相关资源
      最近更新 更多