【问题标题】:Caching & GZip on GAE (Community Wiki)GAE 上的缓存和 GZip(社区 Wiki)
【发布时间】:2011-02-11 23:00:10
【问题描述】:

为什么 Google App Engine 似乎没有在我的 CSS 样式表和 JavaScript 文件上设置适当的缓存友好标头(例如遥远的到期日期)? GAE 什么时候压缩这些文件?我的app.yaml 将相应的目录标记为static_dirs,所以没有远期的到期日期让我有点吃惊。

这是一个社区 wiki,展示有关 GAE 上的静态文件缓存和 gzip 压缩的最佳实践!

【问题讨论】:

  • 对于因“不是真正的问题”而投票结束的人,如果需要,请编辑问题以添加更多问号。
  • 没关系,我自己加了问号。对于它的价值,如果 OP 没有,我很快就会问这个问题,因为我在搞砸 YSlow 之后一直在想这个问题

标签: google-app-engine caching gzip


【解决方案1】:

GAE 如何处理缓存?

似乎 GAE 设置了近期的缓存过期时间,但确实使用了 etag 标头。使用它是为了让浏览器可以询问,“自从它有 etagX68f0o 以来,这个文件是否发生了变化?”并听到“不——304 Not Modified”的回复。

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

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

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

要使用遥远的到期日期需要两个步骤和一点理解。

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

  2. 通过在app.yaml 中使用default_expiration 和/或expiration 来配置GAE 以设置您想要的过期时间。 GAE docs on static files

第三种选择:应用程序清单

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

GAEgzip什么时候?

根据Google’s FAQ

Google App Engine 尽最大努力将 gzip 压缩的内容提供给支持它的浏览器。利用此方案是自动的,无需对应用程序进行修改。

我们结合使用请求标头(Accept-Encoding、User-Agent)和响应标头(Content-Type)来确定最终用户是否可以利用 gzip 压缩的内容。这种方法避免了流行浏览器中 gzip 内容的一些众所周知的错误。要强制提供 gzip 压缩的内容,客户端可以提供“gzip”作为 Accept-Encoding 和 User-Agent 请求标头的值。如果没有 Accept-Encoding 标头,则永远不会压缩内容。

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

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

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

【讨论】:

  • 您可以在 app.yaml 中对静态处理程序设置过期时间,请参阅code.google.com/appengine/docs/python/config/…
  • You have to manually update your app to request new versions of resources, by e.g. naming files like mysitesstyles.2011-02-11T0411.css instead of mysitestyles.css. 这似乎是版本控制的噩梦。为什么不直接将查询字符串附加到 CSS 文件的末尾,例如 mysitestyles.css?v=2012-5-10。您不会复制文件,并且您还可以在更新应用程序时向用户提供新文件。虽然 CSS 文件不使用查询字符串,但浏览器使用完整的 URI 作为键来缓存资源,而不仅仅是文件名。如果我在这里遗漏了什么,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
相关资源
最近更新 更多