Как заставить браузер не кэшировать файл CSS при изменении файла CSS?
У меня есть файл базового макета, который используется в большинстве представлений. В базовом макете мне нужен модуль, использующий плагин ресурсов Grails.
<r:require module="core"/>
Модули определены в файле conf/ApplicationResources.groovy как
modules = {
core {
resource url: '/css/main.css'
resource url: 'js/application.js'
}
}
Теперь вот проблема. Я делаю изменения в файле main.css и собираю приложение. Изменение не отражается в браузере. Он будет обновляться только в том случае, если я просматриваю исходный код и затем нажимаю на файл CSS, а затем обновляю этот файл CSS. Браузер кэширует файл CSS. Я попытался добавить версию к приведенному выше коду, как
modules = {
core {
resource url: '/css/main.css?version=2'
resource url: 'js/application.js'
}
}
но это тоже не работает. Когда я смотрю на сгенерированный тег ссылки CSS, я вижу, что файл CSS
<link href="/app/static/bundle-bundle_core_head.css" type="text/css" rel="stylesheet" media="screen, projection" />
Так что имеет смысл, почему версия не работает. Я пытался в крайнем случае
<link href="/app/static/bundle-bundle_core_head.css?version=2" type="text/css" rel="stylesheet" media="screen, projection" />
и файл CSS был наконец обновлен. Но я не могу использовать это решение, так как это был взлом.
Поэтому у меня вопрос, есть ли способ, чтобы файл css автоматически обновлялся, когда я вносил изменения в файл css при использовании плагина ресурсов grails.
Плагин ресурсов
http://grails.org/plugin/resources
Версия Grails, которую я использую, - 2.2, а версия плагина ресурсов - 1.1.6.
2 ответа
Если вы используете веб-сервер Apache, вы можете использовать файл.htaccess. Указав соответствующий файл, он не будет кэширован.
<Files main.css>
FileETag None
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</Files>
Прагматичный подход (если все подходы терпят неудачу) может состоять в том, чтобы изменить имя CSS-файлов, которые изменились (например, bundle-bundle_core_head_vjfiduht.css
). Таким образом, браузер не распознает файл и обязательно пытается загрузить его.
С другой стороны: в prod
плагин ресурсов должен использовать хеш-значение для имени доставленных ресурсов (учитывая, что вы не отключили его с помощью grails.resources.mappers.hashandcache.enabled = false
,