3

我希望通过 <script> 标记引用的 JavaScript、我的 css 和各种图形文件缓存在用户浏览器上,以用于我的网站的给定版本。但是,当我发布对文件的更新时,我想确保新内容(Javascript、css、图形等)将在用户的机器上更新。

在研究这个问题时,我遇到了许多可能的解决方案:

  1. 为缓存控制和过期等内容调整 http 标头
  2. 将唯一的查询字符串附加到每个资源请求
  3. 在所请求资源的路径(或文件名)中包含版本号

我对选项 1 的担忧(除了不知道如何为某些内容类型实现它)是,如果浏览器和 IIS 之间有中间代理,那么中间代理可能不尊重 http 标头,并且内容将被缓存在浏览器和代理。

我对选项 2 的关注有两个方面。一方面,如果我只使用随机数或时间戳,那么浏览器每次都会请求新资源,即使内容没有更改(版本之间没有更改)也会绕过本地缓存。解决此问题的方法是使用资源文件的时间戳或文件的哈希;这只有在新版本出现时才会改变。然而,这导致了我的第二个担忧:我知道一些网络代理从不缓存任何带有查询字符串的东西,默认情况下(http://stackoverflow.com/questions/5541340/how-can-i-prevent-javascript-caching-查询字符串方法不工作)。虽然这可能是可定制的,但我不想依赖管理员更改默认设置,以获得缓存的性能优势。

选项 3 似乎是最佳选择,但对于 ASP .NET MVC(当前使用 ASP .NET MVC 3),我不知道如何以实用的方式实现它。手动,我可以进入每个链接到图形、css 或外部 javascript 文件的文件,并更改路径以包含每个版本的不同版本号,但显然这很乏味且容易出错。

那么我的问题是:

1)是否有任何其他策略可以避免缓存(对于给定版本)我应该考虑和

2) 假设我使用选项 3(包括资源路径中的版本号),我如何在 ASP .NET MVC 应用程序中以一种易于维护的方式实现这一点?

谢谢,

巴黎圣母院

4

2 回答 2

2

这个想法是每当 js、css 文件的版本发生变化时,您必须从服务器更改 URL,以便浏览器请求新版本。

请参阅此线程中@Kip 的答案,清楚地描述了这一点。虽然答案在 php 中,但它可以在 asp.net mvc 本身中实现。

如果您使用的是 ASP.NET MVC 4 的新捆绑/缩小功能,我认为它会自动处理版本控制(虽然不确定)。

于 2012-06-20T05:28:13.337 回答
1

Http 缓存以两种方式完成。通过验证机制和过期机制。

对于到期机制,您可以在标头上使用 expires(但这对于您知道永远不会改变的静态资源很有用)。

对于验证机制和条件获取 ETag,使用这似乎是解决您的问题的完美案例。

于 2012-06-19T17:34:12.277 回答