Rails 3:当CSS文件中指定图像时如何防止图像缓存?

发布于 2024-11-29 16:42:25 字数 421 浏览 1 评论 0 原文

考虑以下 CSS:

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

有时我通过添加新精灵来更改 sprites.png,因此我不希望浏览器缓存它。

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

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

Consider the following CSS:

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

Sometimes I change sprites.png by adding new sprites to it, so I don't want the browser to cache it.

One idea I thought of is to add style="background-image: url(/images/sprites.png?<random_number_here>)" to all elements with class my_class, and delete the CSS code above.
But, I don't like this solution because of maintainability issues (if for example the file name changes, I have to change it in many places, rather than a single CSS).

What other solutions exist to this problem ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

最好是你 2024-12-06 16:42:25

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

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

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

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

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

任何当你改变你的站点的资产,您可以更改样式表链接中文件夹的版本号。

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)

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

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:

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

Any time you change your site's assets, you change the version number of the folder in your stylesheet link.

满天都是小星星 2024-12-06 16:42:25

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

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

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

对给定页面使用特定的服务器内容控制。这是来自 此 StackExchange 答案(< a href="https://serverfault.com/questions/235242/how-to-set-no-cache-headers-to-a-specific-url-using-htaccess-and-mod-rewrite">类似技术存在于 apache):

 server {
   ...

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

这些都可以帮助缓解您的问题。祝你好运!

I would suggest one of these two techniques:

Use Javascript to perform the cache update technique.

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

Use specific server content-control for your given page. This is from this StackExchange answer for nginx (similar techniques exist in apache):

 server {
   ...

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

These will both work to help mitigate your issue. Good luck!

幸福还没到 2024-12-06 16:42:25

使用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).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文