4

我正在为我的网站使用 Play Framework 2.1.3,并且我注意到内置的 Web 服务器 (Netty) 不提供 Gzipped 资产,尽管 Play 文档说它应该在同名资产时自动提供公共文件夹中存在 .gz 前缀。

我已经尝试手动压缩资产(例如 bootstrap.min.js -> bootstrap.min.js.gz),框架不会通过资产控制器提供 .gz 版本的文件。我还尝试在 Build.scala 中使用以下(hackish)代码来实现自动 Gzipping,但它似乎仍然无法正常工作(而且我也无法确定 Gzip 文件的位置,即使日志说这些资产实际上是 Gzipped):

     val gzippableAssets = SettingKey[PathFinder]("gzippable-assets", "Defines the files to gzip")
  val gzipAssets = TaskKey[Seq[File]]("gzip-assets", "gzip all assets")
  lazy val gzipAssetsSetting = gzipAssets <<= gzipAssetsTask dependsOn (copyResources in Compile)
  lazy val gzipAssetsTask = (gzippableAssets, streams) map {
    case (finder: PathFinder, s: TaskStreams) => {
      var count = 0
      var files = finder.get.map { file =>
        val gzTarget = new File(file.getAbsolutePath + ".gz")
        IO.gzip(file, gzTarget)
        count += 1;
        gzTarget
      }
      s.log.info("Compressed " + count + " asset(s)")
      files
    }
  }

  val main = play.Project(appName, appVersion, appDependencies).settings(
    // Add your own project settings here
    resolvers += Resolver.url("sitemapper repository", url("http://blabluble.github.com/modules/releases/"))(Resolver.ivyStylePatterns),
    gzippableAssets <<= (classDirectory in Compile)(dir => (dir ** ("*.js" || "*.css" || "*.html" || "*.jpg" || "*.png" || "*.jpeg" || "*.gif" || "*.eot" || "*.svg" || "*.ttf" || "*.woff"))),
    gzipAssetsSetting,
    playPackageEverything <<= playPackageEverything dependsOn gzipAssets

  )

为什么 Play 不能像其他所有主要的 Web 框架一样在本地包含 GZIP 支持,而不是让人们一起破解它?目前,使用前端 Web 服务器为我做这件事不是一种选择。非常感谢任何建议或更简单的方法。Play 文档在这样的事情上相当稀疏。

对于那些有兴趣验证是否缺少 GZip 资产服务的人,该网站是http://Netizen.us

4

1 回答 1

4

我怀疑您在开发模式下而不是在生产模式下测试了 gzip 交付。在开发模式下,很多优化都关闭了。

Play 2.2 将有更好的 gzip 支持:https ://github.com/playframework/playframework/pull/1515


我创建了一个测试项目(https://github.com/schleichardt/stackoverflow-answers/tree/so18604777),我无法在 prod 模式下重现

sbt dist && cd dist && unzip so18604777-1.0-SNAPSHOT.zip && cd so18604777-1.0-SNAPSHOT && bash start 

我为 main.css 手动创建了 main.css.gz 并在 Chromium 28 中获得了以下响应标头:

HTTP/1.1 200 OK
Vary: Accept-Encoding
Last-Modified: Wed, 04 Sep 2013 06:13:32 GMT
Etag: "67253bcb7bacb5bbfe3d445f35ae177b60429d5e"
Content-Encoding: gzip
Content-Length: 49
Cache-Control: max-age=3600
Content-Type: text/css; charset=utf-8
Date: Wed, 04 Sep 2013 06:18:00 GMT

49 字节正好是 gzip 压缩文件的大小(原始:20 字节),显示的内容是正确的。

对于具有另一个但相同内容但没有 gzip 等价物的文件:

HTTP/1.1 200 OK
Last-Modified: Wed, 04 Sep 2013 06:13:32 GMT
Etag: "48ccae14d846b77d1a33a1db18f52e0841f0a830"
Content-Length: 20
Cache-Control: max-age=3600
Content-Type: text/css; charset=utf-8
Date: Wed, 04 Sep 2013 06:18:25 GMT
于 2013-09-04T06:31:09.283 回答