在我的应用程序中,用户可以选择修改其站点的 CSS。
这不太可能经常改变,但是当它发生时,我们需要确保他们和他们的网站访问者能够立即看到结果。
我们确实记录了用户更新 CSS 的日期和时间,因此一个简单的解决方案就是在 url 上附加一个时间戳。
但是,我想知道是否可以以编程方式设置缓存标头以强制浏览器在 CSS 文件更改时重新请求它。
在我的应用程序中,用户可以选择修改其站点的 CSS。
这不太可能经常改变,但是当它发生时,我们需要确保他们和他们的网站访问者能够立即看到结果。
我们确实记录了用户更新 CSS 的日期和时间,因此一个简单的解决方案就是在 url 上附加一个时间戳。
但是,我想知道是否可以以编程方式设置缓存标头以强制浏览器在 CSS 文件更改时重新请求它。
如果您在网址中包含哈希,即
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 在更改时是否会刷新:
使用 url 哈希,最坏的情况是客户端不会将您的 css 放入缓存中,但不会改变用户体验,因为他们总是获得最新版本。
对于到期日期或最后修改日期,最坏的情况是客户端获得旧版本,这将改变用户体验:)
感谢 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
其作为最后修改日期传递。