1

考虑以下 CSS:

.my_class {
  background-image: url(/images/sprites.png);
}

有时我会sprites.png通过添加新的精灵来改变它,所以我不希望浏览器缓存它。

我想到的一个想法是style="background-image: url(/images/sprites.png?<random_number_here>)"使用 class 添加到所有元素my_class,并删除上面的 CSS 代码。但是,由于可维护性问题,我不喜欢这种解决方案(例如,如果文件名更改,我必须在很多地方更改它,而不是单个 CSS)。

这个问题还有哪些其他解决方案?

4

3 回答 3

1

我建议使用以下两种技术之一:

使用 Javascript 执行缓存更新技术。

 $('.my_class').ready(function() { 
   $(this).css('background-image', 
    $(this).css('background-image') + "?" + Math.random());
 }

为您的给定页面使用特定的服务器内容控制。这是来自nginx 的StackExchange 答案类似的技术存在于 apache 中):

 server {
   ...

   location = /images/sprites.png {
    expires 1d;
   }
   ...
 }

这些都将有助于缓解您的问题。祝你好运!

于 2011-08-15T00:20:45.690 回答
1

解决此问题的一种方法是将版本字符串添加到您的样式目录

<link rel="stylesheet" href="/css.1000/styles.css" type="text/css" />

确保您的 css 使用相对于该目录的 URL。(在本例中,css 链接的图像目录为css.1000/image

.my_class {
    background-image: url(images/sprites.png);
}

然后,使用mod_rewrite.htaccess站点根文件夹中的文件添加重写规则,这将使任何数字路径/css.1000/styles.css指向/css/styles.css服务器上:

RewriteEngine On
RewriteRule css[\.][0-9]+/(.*)$ css/$1 [L]

每当您更改站点的资产时,都会更改样式表链接中文件夹的版本号。

于 2011-08-15T00:16:58.953 回答
0

使用 rails 资产管道(即 rails > 3.1),它会通过指纹机制自动为您执行此操作:

http://guides.rubyonrails.org/asset_pipeline.html#what-is-fingerprinting-and-why-should-i-care-questionmark

将您的 mycss.css 重命名为 mycss.css.erb 并将图像指定为:

.my_class { background-image: url(<%= asset_path 'image.png' %>) }

Rails 会处理其他所有事情(您还需要启用资产预编译)。

于 2013-09-25T07:56:18.937 回答