Rails 3: Как предотвратить кэширование изображений, когда изображение указано в файле CSS?
Рассмотрим следующий CSS:
.my_class {
background-image: url(/images/sprites.png);
}
Иногда я меняю sprites.png
добавив в него новые спрайты, чтобы браузер не кэшировал его.
Одна мысль, о которой я подумал, это добавить style="background-image: url(/images/sprites.png?<random_number_here>)"
для всех элементов с классом my_class
и удалите код CSS выше. Но мне не нравится это решение из-за проблем с удобством сопровождения (если, например, имя файла меняется, я должен изменить его во многих местах, а не в одном CSS).
Какие другие решения существуют для этой проблемы?
3 ответа
Одним из способов решения этой проблемы является добавление строки версии в каталог стилей.
<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]
Каждый раз, когда вы меняете ресурсы своего сайта, вы меняете номер версии папки в ссылке на таблицу стилей.
Я бы предложил один из этих двух методов:
Используйте Javascript для выполнения техники обновления кэша.
$('.my_class').ready(function() {
$(this).css('background-image',
$(this).css('background-image') + "?" + Math.random());
}
Используйте определенный серверный контент-контроль для данной страницы. Это из ответа StackExchange для nginx ( аналогичные методы существуют в apache):
server {
...
location = /images/sprites.png {
expires 1d;
}
...
}
Они оба будут работать, чтобы помочь смягчить вашу проблему. Удачи!
Используйте конвейер ресурсов rails (т.е. rails > 3.1), и он автоматически сделает это за вас с помощью механизма снятия отпечатков:
http://guides.rubyonrails.org/asset_pipeline.html
Переименуйте ваш mycss.css в mycss.css.erb и укажите изображения как:
.my_class { background-image: url(<%= asset_path 'image.png' %>) }
Rails позаботится обо всем остальном (вам также необходимо включить прекомпиляцию ресурсов).