为什么Google App Engine似乎没有在我的CSS样式表和JavaScript文件上设置适当的缓存友好标头(如远期到期日期)? GAE何时gzip这些文件?我的app.yaml
将各个目录标记为static_dir
s,因此缺少远期到期日期对我来说是令人惊讶的。
这是一个社区维基,用于展示有关GAE上静态文件缓存和gzipping的最佳实践!
答案 0 :(得分:15)
似乎GAE设置了近期缓存到期时间,但确实使用了etag
标头。这是使用的,因此浏览器可以询问“此文件是否已更改etag
X68f0o
?”并听到“Nope - 304 Not Modified
”回复。
与远期的到期日相反,这有以下权衡:
etag
使用远期到期日期需要两个步骤并且有点理解。
您必须手动更新您的应用以请求新版本的资源,例如:命名mysitesstyles.2011-02-11T0411.css
而不是mysitestyles.css
等文件。有一些工具可以帮助自动化,但我不知道任何与GAE直接相关的工具。
使用default_expiration
中的expiration
和/或app.yaml
配置GAE以设置所需的到期时间。 GAE docs on static files
缓存清单是HTML5功能,可覆盖缓存标头。 MDN article,DiveIntoHTML5,W3C。但是,这不仅影响脚本和样式文件的缓存。小心使用!
gzip
?根据Google’s FAQ,
Google App Engine尽最大努力为支持它的浏览器提供gzip压缩内容。利用这种方案是自动的,不需要修改应用程序。
我们使用请求标头(Accept-Encoding,User-Agent)和响应标头(Content-Type)的组合来确定最终用户是否可以利用gzip压缩内容。这种方法避免了流行浏览器中带有gzip压缩内容的一些众所周知的错误。要强制提供gzip压缩内容,客户端可以提供“gzip”作为Accept-Encoding和User-Agent请求标头的值。如果不存在Accept-Encoding标头,则永远不会对内容进行gzip压缩。
一些现实世界的观察确实证明了这一点通常是正确的。假设一个支持gzip的浏览器:
content-type
个text/html; charset=utf-8
标题static_dir
中的脚本和样式(在app.yaml
中定义)。