如何预压缩非常大的HTML文件

10

我需要使用gzip或deflate对非常大的html/xml/json文件(大数据转储)进行预压缩。我从不想提供未压缩的文件。它们如此巨大和重复,以至于压缩可能会非常有效,并且虽然一些旧浏览器无法支持解压缩,但我的典型客户不会使用它们(尽管如果我可以生成某种“嘿,您需要升级您的浏览器”的消息就好了)。

我自动生成文件,并且可以轻松生成.htaccess文件来配合每种文件类型。基本上我想要一个类似于mod_gunzip的始终开启的版本。因为文件很大,而且因为我将重复地提供它们,所以我需要一种方法,使我能够在命令行上进行一次非常好的压缩。

我在这个网站和其他网站上找到了一些有关使用gzip如何做到这一点的信息,但我想知道是否有人可以步骤地指导我如何使用deflate做到这一点。奖励分数是完整的答案,包括我的.htaccess文件应该是什么样子,以及我应该使用的命令行代码(GNU/Linux)来获得最佳压缩。超级奖励分数是一个回答,还涉及如何向不兼容的浏览器发送“对不起,没有文件”的消息。

如果我们能创建一个“预压缩”标记来覆盖这类问题将会很棒。

-FT


1
你可能会从serverfault.com获得更好的响应。 - David Waters
1
看起来是 https://dev59.com/fnVD5IYBdhLWcg3wI3-L 的重复。 - skaffman
@ftrotter:创建一个标签就像使用新标签重新标记一个问题一样简单。 - caf
1
这个问题是否更适合在Server Fault上提问? - Evan Plaice
有人能给我解释一下吗?为什么不在文件创建后立即压缩文件并提供压缩文件作为压缩文件呢?用户可能还想将其文件打包存储,他们可以随时通过双击和拖放来解压缩。 - naugtur
显示剩余3条评论
4个回答

8

编辑:找到了在mod_mime中的AddEncoding

这样做可以实现:

<IfModule mod_mime.c>
 <Files "*.html.gz">
  ForceType text/html
 </Files>
 <Files "*.xml.gz">
  ForceType application/xml
 </Files>
 <Files "*.js.gz">
  ForceType application/javascript
 </Files>
 <Files "*.gz">
  AddEncoding gzip .gz
 </Files>
</IfModule>

文档中似乎只需要使用AddEncoding,但我没能使其工作。
此外,Lighttpd的mod_compression可以压缩和缓存(已压缩的)文件。

如果你能包含MIME类型代码,我会接受这个答案,看起来没人会给我一个完整的答案,包括deflate选项... - ftrotter
这也是一个吗: <FilesMatch "\.html\.z$"><IfModule mod_headers.c>Header set Content-Encoding: deflate</IfModule></FilesMatch> - maxwellb

3
如果我是你,我会考虑使用内置的文件系统压缩,而不是在apache层面上进行压缩。在Solaris上,ZFS具有透明的压缩功能,可以使用zfs compress来压缩文件系统。同样,在Windows上可以压缩文件夹,Apache将无视磁盘上已经压缩的内容并提供服务。Linux也有支持透明压缩的文件系统。

很好的评论。在Linux上使用哪种文件系统以及在云实例中如何操作的建议?如何正确设置头部(以便客户端能够理解内容)? - ftrotter
在Linux上它并不太优雅,但是有一些fuse模块可以进行透明的压缩/解压缩,比如这个:http://miio.net/wordpress/projects/fusecompress/你不需要对Apache中的头文件做任何处理,因为在Apache看来它们就是普通的文件。 :-) - Jubal
2
我不认为这个答案解决了问题。听起来好像ftrotter想要预压缩文件以节省请求时间的处理开销。如果使用透明文件系统压缩,Apache仍然需要在请求时重新压缩。 - Jason R. Coombs
我想我一定误读了问题。我以为意图是为了节省机器空间,但是你说得对,重新阅读问题后我明白了。 - Jubal

2
在命令行中,编译zlib的zpipe:http://www.zlib.net/zpipe.c,然后...
zpipe < BIGfile.html > BIGfile.htmlz

例如。
然后使用Zash的示例,设置一个过滤器来更改标题。这应该使您拥有原始压缩文件,现代浏览器可能支持
另一种压缩文件的方法是,使用zlib(-z)或PKWare zip(-K)压缩选项使用pigz。测试一下它们在设置内容编码时是否能正常工作。

哦,还要在zpipe中将Z_DEFAULT_COMPRESSION更改为Z_BEST_COMPRESSION。 - maxwellb
这个程序是做“deflate”压缩还是只有gzip? - ftrotter
zpipe 至少可以进行 deflate 压缩。 尝试为 pigz 压缩设置一个测试文件,但我目前实在没有测试环境来测试它。 Pigz 还可以通过利用多个核心来更快地压缩。太棒了。 - maxwellb

0
一个快速压缩内容的方法,而不必直接处理 moz_gzip/mod_defalte,是使用 ob_gzhandler 并在任何输出发送到浏览器之前修改头文件。
<?php
/* Replace CHANGE_ME with the correct mime type of your large file. 
 i.e: application/json
*/

ob_start ('ob_gzhandler');
header('Content-type: CHANGE_ME; charset: UTF-8');
header('Cache-Control: must-revalidate');
$offset = 60 * 60 * 2 ;
$ExpStr = 'Expires: ' . gmdate('D, d M Y H:i:s',time() + $offset) . ' GMT';
header($ExpStr);

/* Stuff to generate your large files here */

这是即时进行gzip压缩。但文件已经存在于磁盘上,可能是html/json/xml等格式。我想我可以使用PHP生成正确的标头,然后回显文件(或相当于回显),但是难道没有一种只使用Apache就能实现的方法吗? - ftrotter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接