Ruby on rails Rails3:在CSS文件中指定图像时,如何防止图像缓存?
考虑以下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代码。 但是,我不喜欢这个解决方案,因为存在可维护性问题(例如,如果文件名更改,我必须在许多地方更
.my_class {
background-image: url(/images/sprites.png);
}
有时我会通过添加新的精灵来更改sprites.png,所以我不希望浏览器缓存它
我想到的一个想法是向所有使用classmy_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;
}
...
}