Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails3:在CSS文件中指定图像时,如何防止图像缓存?_Ruby On Rails_Css_Ruby On Rails 3_Browser Cache_Image Caching - Fatal编程技术网

Ruby on rails Rails3:在CSS文件中指定图像时,如何防止图像缓存?

Ruby on rails Rails3:在CSS文件中指定图像时,如何防止图像缓存?,ruby-on-rails,css,ruby-on-rails-3,browser-cache,image-caching,Ruby On Rails,Css,Ruby On Rails 3,Browser Cache,Image Caching,考虑以下CSS: .my_class { background-image: url(/images/sprites.png); } 有时我会通过添加新的精灵来更改sprites.png,所以我不希望浏览器缓存它 我想到的一个想法是向所有使用classmy_class的元素添加style=“background image:url(/images/sprites.png?),并删除上面的CSS代码。 但是,我不喜欢这个解决方案,因为存在可维护性问题(例如,如果文件名更改,我必须在许多地方更

考虑以下CSS:

.my_class {
  background-image: url(/images/sprites.png);
}
有时我会通过添加新的精灵来更改sprites.png,所以我不希望浏览器缓存它

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

对于这个问题还有什么其他的解决办法?

解决这个问题的一种方法是

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

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

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

无论何时更改站点的资产,都会更改样式表链接中文件夹的版本号

我建议使用以下两种方法之一:

使用Javascript执行缓存更新技术

 $('.my_class').ready(function() { 
   $(this).css('background-image', 
    $(this).css('background-image') + "?" + Math.random());
 }
对给定页面使用特定的服务器内容控件。这是针对nginx()的源代码:

这两者都有助于缓解您的问题。祝你好运

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

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

.my_class{背景图像:url()}


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

为什么不在发生更改时让缓存过期呢?客户端应在显示本地缓存之前查询服务器并查看内容是否已修改。@Devin:缓存如何过期?Rails应自动向资产添加时间戳,请参阅标题“自定义资产路径”下的@Devin M,而Rails确实为css和图像链接提供时间戳,据我所知,这不适用于css
背景图像
链接。
 $('.my_class').ready(function() { 
   $(this).css('background-image', 
    $(this).css('background-image') + "?" + Math.random());
 }
 server {
   ...

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