如何在css文件更改时强制浏览器不缓存css文件?

时间:2017-09-12 09:40:30

标签: css grails grails-resources-plugin

我有一个基本布局文件,在大多数视图中使用。在基本布局中,我需要一个使用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文件。但我无法使用此解决方案,因为那是一个黑客攻击。

所以我的问题是,当我使用grails资源插件更改css文件时,有一种方法可以自动更新css文件。

资源插件

http://grails.org/plugin/resources

我使用的grails版本是2.2,资源插件版本是1.1.6。

2 个答案:

答案 0 :(得分:0)

如果您使用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>

答案 1 :(得分:0)

实用方法(如果所有aproach都失败)可能是更改已更改的CSS文件的名称(例如let find_n l n ~f = let rec loop l' n' acc = if n' = 0 then acc else match l' with | [] -> failwith "Cannot find enough items" | h::t -> if f h then loop t (n' - 1) (h::acc) else loop t n' acc in loop l n [] )。这样浏览器就无法识别文件并且肯定会尝试加载它。

另一方面:在bundle-bundle_core_head_vjfiduht.css中,资源插件应该使用哈希值作为已传递资源的名称(假设您没有通过prod将其关闭。