4

在我的应用程序中,用户可以选择修改其站点的 CSS。

这不太可能经常改变,但是当它发生时,我们需要确保他们和他们的网站访问者能够立即看到结果。

我们确实记录了用户更新 CSS 的日期和时间,因此一个简单的解决方案就是在 url 上附加一个时间戳。

但是,我想知道是否可以以编程方式设置缓存标头以强制浏览器在 CSS 文件更改时重新请求它。

4

2 回答 2

4

如果您在网址中包含哈希,即

http://server.example.com/styles/css.css?hash 

它会在哈希更改时重新加载,因为浏览器将从新的 url 获取它:

版本 1:

<style type="text/css" link="styles/css.css?hash=v1" />

版本 2:

<style type="text/css" link="styles/css.css?hash=v2" />

客户端缓存是客户端的事情,让他们按照他们认为合适的方式进行操作:新的 URL 意味着资源已更改,因此需要重新加载。由于不同的客户端实现,使用缓存控制标头保持相同的 URL 可能会让您陷入痛苦的境地。

如果您放置缓存控制标头(last-modified、expires、ETAG),您无法确定 CSS 在更改时是否会刷新:

  • 因为激进的浏览器(或代理)缓存可能会忽略这些。
  • 因为您可能在 5 月 1 日提供 V1,到期日期为 6 月 1 日,在 5 月 15 日更新到 V2,您的客户将需要等待 15 天才能获得新版本。

使用 url 哈希,最坏的情况是客户端不会将您的 css 放入缓存中,但不会改变用户体验,因为他们总是获得最新版本。

对于到期日期或最后修改日期,最坏的情况是客户端获得旧版本,这将改变用户体验:)

于 2012-06-13T12:27:48.410 回答
1

感谢 Mathieu 的回复,我正在使用输出缓存和版本号的组合来处理缓存失效。

输出缓存配置文件:

我创建了以下用于附加时间戳的扩展方法:

    public static string AppendTimeStamp(this string src, DateTime lastModified)
    {
        if (string.IsNullOrEmpty(src))
            return src;

        return string.Format("{0}?v={1}", src, lastModified.ToString("yyyyMMddHHmmss"));
    }

用法:

<link rel="stylesheet" href="@Url.Content("~/assets/usercss").AppendTimeStamp(CustomizationSettings.LastModified)"/>

如果您不想缓存文件,您可以将DateTime.UtcNow其作为最后修改日期传递。

于 2012-06-13T13:06:18.913 回答