【问题标题】:Http caching - style.css?123 or style_123.css?Http 缓存 - style.css?123 还是 style_123.css?
【发布时间】:2010-01-18 21:22:12
【问题描述】:

我目前正在使用构建/部署脚本来缩小静态资源。按照良好的做法,我想为我的大多数 javascript、样式表和图像设置一个过期标头。

对于我的问题,当一个或多个静态文件发生更改时,客户端应该要求提供最新版本的文件。在 url 之后添加 /css/style.css ?1235 之类的内容是否足以触发新请求?还是我必须为每个构建重命名我的所有静态文件(例如 /css/style _12345.css)?

更新:澄清一下,我问的原因是我注意到许多其他部署脚本似乎通过重命名每个文件来采用“硬”路径。

【问题讨论】:

  • hard 方式的优点是您可以非常简单地保持所有旧版本可用,如果您想使用特定版本的 API,这将很有用。

标签: http caching


【解决方案1】:

将添加类似的内容 /css/style.css ?1235 后的 url 是 足以触发新请求?

是的,当然。

你可以这样做:

style.css?UNIXTIMESTAMP

其中 UNIXTIMESTAMP 是以 unix 时间戳格式创建文件的时间

【讨论】:

  • 我可能会使用我的 vcs 中的修订号。
  • 请记住,“/css/style.css”与浏览器缓存中的“/css/style.css?12345”不同。这意味着如果页面 A 和 B 都链接到前者,如果你用后者更新页面 A,页面 B 仍将指向前者。然后,如果您将页面 B 更改为“/css/style.css?6789”,您将在缓存中拥有第三个副本。
【解决方案2】:

RFC 2616 3.2 Uniform Resource Identifiers 说:

就 HTTP 而言,统一资源标识符是简单的格式化字符串,通过名称、位置或任何其他特征识别资源。

因此,http://foo/barhttp://foo/bar?baz 是不同的资源。

某些 URI 被视为等效,因此 http://foo/bar?bazhttp://foo/bar?BAZ 是相同的资源(请参阅 3.2.3 URI Comparison)。

HTTP 确实包含一些用于处理query part 的缓存异常(请参阅13.9 Side Effects of GET and HEAD)。我理解这些仅适用于完全相同的查询。

【讨论】:

    【解决方案3】:

    如果你可以使用 mod_rewrite 我添加这样的规则:

    RewriteRule ^/((.*)_[0-9]+(\.(?:js|css|swf).*))$ /$2$3 [NC,L]
    

    将任何 javascript、css 或 flash 文件重写为原始名称

    /css/style_1234.css
    

    被重写回

    /css/style.css
    

    【讨论】:

    • 矫枉过正!!!!!!!没必要用这种方式!!您需要做的就是我在回答中写的内容。而已。在文件名后简单添加?something
    • 对于大型动态站点,您可以对“_number”进行编程以遵循版本号,从而将多个文件同时更新到最新版本,而无需担心缓存问题。
    • 你说得对,我忘记了缓存问题。无论如何,正如您所说,它可能是“大型动态网站”的最佳解决方案。
    • @Balon Overkill,但完全可以接受,而且效果很好。
    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 2011-06-15
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2011-02-10
    相关资源
    最近更新 更多