Как заставить браузер не кэшировать файл 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,

Другие вопросы по тегам