我正在为我的网站使用Play Framework 2.1.3而且我注意到内置的Web服务器(Netty)没有提供Gzipped资产,即使Play文档说它应该是自动的 - 无论何时相同 - 具有.gz前缀的名称资产存在于公用文件夹中。
我手动尝试过Gzipping资源(例如bootstrap.min.js - > bootstrap.min.js.gz),框架不会通过Assets控制器提供文件的.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服务器为我做这件事并不是一种选择。非常感谢任何建议或更简单的方法来做到这一点。在这样的事情上播放文档相当稀疏。
对于那些有兴趣验证缺少GZip资产的人,该网站为http://Netizen.us
答案 0 :(得分:4)
我怀疑您在开发模式下测试了gzip传输,而不是在prod模式下。在开发模式下,许多优化都已关闭。
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