我正在尝试使用 renderBinary() 自定义一些静态资源的服务。
我想通过可选检查的 Controller 提供这些 Assets
授权并提供适当的文件。
我还想将一些文件缓存 1 年,因为它们永远不会改变。
我的 Controller 中的方法如下所示:
public static void item(String item) {
// check authorization ...
response.cacheFor("365d");
renderBinary(Play.getFile("static/" + item));
}
我遇到的问题是 play 会自动添加 Etag 和
使用renderBinary时将其缓存1小时,因此最终效果是
firefox 在需要时再次重新发出对这些文件的请求,只是为了得到
来自 Play 服务器的 304 响应。
我知道我可以用 nginx 作为前端来实现,但我想这样做
只用玩。
最佳答案
您无法避免 304 答案,因为 Play 中的缓存是服务器缓存,浏览器必须检查服务器以获取详细信息(答案 304 或项目)。这表明缓存工作正常,因为它被缓存并且不会再次检索。但是请记住,该缓存可能会丢失(如果该项目是旧的并被缓存策略删除),然后请求将再次加载该项目。
唯一真正的解决方案是将 etags 更改为 1 年。 application.conf中有一个属性,http.cacheControl,可以设置缓存的时间。默认为 1 小时,将其设置为 1 年,但请注意这将适用于所有项目(因此,例如,如果您更改 javascript 文件,最好也更改名称!)
关于playframework - 缓存 renderBinary 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7757844/