Rails 3:当CSS文件中指定图像时如何防止图像缓存?
考虑以下 CSS:
.my_class {
background-image: url(/images/sprites.png);
}
有时我通过添加新精灵来更改 sprites.png
,因此我不希望浏览器缓存它。
我想到的一个想法是将 style="background-image: url(/images/sprites.png?
添加到类 my_class
的所有元素中,并删除上面的CSS代码。
但是,由于可维护性问题,我不喜欢这个解决方案(例如,如果文件名发生变化,我必须在很多地方更改它,而不是单个 CSS)。
对于这个问题还有哪些其他解决方案?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
解决此问题的一种方法是将版本字符串添加到样式目录。
确保您的 css 使用相对于该目录的 URL。 (在本例中,css链接的图像目录为
css.1000/image
)然后,使用
mod_rewrite
向.htaccess
添加重写规则code> 文件放在站点的根文件夹中,这将使任何数字路径/css.1000/styles.css
指向服务器上的/css/styles.css
:任何当你改变你的站点的资产,您可以更改样式表链接中文件夹的版本号。
One way around this is to add a version string to your style directory.
<link rel="stylesheet" href="/css.1000/styles.css" type="text/css" />
Ensure that your css uses URLs relative to that directory. (In this example, the image directory for css links is
css.1000/image
)Then, use
mod_rewrite
to add a rewrite rule to the.htaccess
file in your site's root folder, this will make any numerical path/css.1000/styles.css
point to/css/styles.css
on the server:Any time you change your site's assets, you change the version number of the folder in your stylesheet link.
我建议使用这两种技术之一:
使用 Javascript 执行缓存更新技术。
对给定页面使用特定的服务器内容控制。这是来自 此 StackExchange 答案(< a href="https://serverfault.com/questions/235242/how-to-set-no-cache-headers-to-a-specific-url-using-htaccess-and-mod-rewrite">类似技术存在于 apache):
这些都可以帮助缓解您的问题。祝你好运!
I would suggest one of these two techniques:
Use Javascript to perform the cache update technique.
Use specific server content-control for your given page. This is from this StackExchange answer for nginx (similar techniques exist in apache):
These will both work to help mitigate your issue. Good luck!
使用rails asset pipeline(即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将处理其他一切(您还需要启用资产预编译)。
Use rails asset pipeline (i.e. rails > 3.1), and it automatically does this for you via the fingerprinting mechanism:
http://guides.rubyonrails.org/asset_pipeline.html#what-is-fingerprinting-and-why-should-i-care-questionmark
Rename your mycss.css to mycss.css.erb and specify the images as:
.my_class { background-image: url(<%= asset_path 'image.png' %>) }
Rails will take care of everything else (you need to enable asset precompilation as well).