缓存& GZip on GAE(社区维基)

时间:2011-02-11 23:00:10

标签: google-app-engine caching gzip

为什么Google App Engine似乎没有在我的CSS样式表和JavaScript文件上设置适当的缓存友好标头(如远期到期日期)? GAE何时gzip这些文件?我的app.yaml将各个目录标记为static_dir s,因此缺少远期到期日期对我来说是令人惊讶的。

这是一个社区维基,用于展示有关GAE上静态文件缓存和gzipping的最佳实践!

1 个答案:

答案 0 :(得分:15)

GAE如何处理缓存?

似乎GAE设置了近期缓存到期时间,但确实使用了etag标头。这是使用的,因此浏览器可以询问“此文件是否已更改etag X68f0o?”并听到“Nope - 304 Not Modified”回复。

与远期的到期日相反,这有以下权衡:

  • 您的最终用户将获得您资源的最新副本,即使它们具有相同的名称(与远期过期不同)。这是
  • 但是,您的最终用户仍然需要请求检查该文件的状态。这确实会降低您的网站速度,并且在内容未更改时“纯粹开销”。这不理想。

选择远期缓存过期而不是(仅)etag

使用远期到期日期需要两个步骤并且有点理解。

  1. 您必须手动更新您的应用以请求新版本的资源,例如:命名mysitesstyles.2011-02-11T0411.css而不是mysitestyles.css等文件。有一些工具可以帮助自动化,但我不知道任何与GAE直接相关的工具。

  2. 使用default_expiration中的expiration和/或app.yaml配置GAE以设置所需的到期时间。 GAE docs on static files

  3. 第三种选择:申请清单

    缓存清单是HTML5功能,可覆盖缓存标头。 MDN articleDiveIntoHTML5W3C。但是,这不仅影响脚本和样式文件的缓存。小心使用!

    何时GAE 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压缩。

         

    运行时环境文档(Java | Python)中对此进行了进一步介绍。

    一些现实世界的观察确实证明了这一点通常是正确的。假设一个支持gzip的浏览器:

    • GAE gzips实际页面(如果他们有content-typetext/html; charset=utf-8标题
    • GAE gzips static_dir中的脚本和样式(在app.yaml中定义)。
    • 请注意,您不应期望GAE gzip图像像GIF或JPEG,因为它们已经被压缩。