在apache中解压预压缩的静态文件
对于静态的 html 文件,在 apache 可加载 mod_deflate.so 模块,把内容压缩后输出,可节约大量的传输带宽。
mod_deflate.so 的用法可在网上找,大部分的文章都是正确的。
像本站(纯粹空间 http://www.softpure.com/),静态的 html 是由 PHP 生成并保存于 /html/ 目录下。生成及用户访问的流程如下:
(流程1)
生成: PHP处理生成代码 > 保存为HTML;
访问: Apache 读取HTML文件 > 压缩 > 输出文件头+文件内容;
客户端: 解压 > 处理
如此一来,用户的每次访问, Apache 都要压缩一次,浪费了大量的资源。
我就想到预压缩 HTML 文件内容,提高 apache 效率,流程改为:
(流程2)
生成: PHP处理生成代码 > 压缩 > 保存为预压缩HTML;
访问: Apache 读取HTML文件 > 输出文件头+文件内容;
客户端: 解压 > 处理
这样用户访问时不用压缩一次,直接发送已压缩的内容,不但效率高,占用资源少,而且减少保存 HTML 的占用空间。
然而,有小部分浏览器/Spider是不支持解压的。对于这类的浏览器,流程1中 Apache 可判断并不压缩内容;但在流程2中,内容已预压缩,只能解压后再发送。
在网上查找资料,看这篇文件,似乎是官方的:
http://mail-archives.apache.org/mod_mbox/httpd-bugs/200409.mbox/%3C20040909145350.20659.qmail@nagoya.betaversion.org%3E
文章说 mod_deflate 是有解压输出的功能的,用
LoadModule deflate_module modules/mod_deflate.so
SetOutputFilter INFLATE
即可解压。并说设置环境变量 force-gunzip=1 即可不管文件类型和Header内容,强制解压, 设置 no-gunzip=1 即可不解压。
在 Apache 2.0.59 和 Apache 2.2.4 下,我试了半天,无论怎么配置,一概不解压
一气之下,下载 Apache 源文件,细细研究。
结果发现:
1) 在 Apache 2.0.59 中,mod_deflate 只有输出压缩和输入解压功能,并没有输出解压功能。
2) 在 Apache 2.2.4 中,mod_deflate 增加了输出解压功能,但它并不读取环境变量 force-gunzip 和 no-gunzip 。
解压的条件是:输入到 Apache 的 Header 中,包含文件头 Content-Encoding: gzip 。
解压后该模块会删除 Content-Encoding 的文件头。
我用 php 先 header('Content-Encoding: gzip '); 发送文件头,然后读取预压缩的HTML文件并输出,果然可以解压。
然而,在 httpd.conf 中设置 Header Append Content-Encoding gzip ,却是不行的。
静态文件是不可能向 apache 发送文件头的,所以用 mod_deflate 的解压方式在这里行不通。
解决的办法,只能自己修改 mod_deflate 模块的源码,然后重新编译。或者,等 Apache 出新版。 Apache 的最新几个版本都陆续对 mod_deflate 有修改。
不过目前我在 Windows 下编译 Apache 还没有测试成功,只能继续查找资料了,有经验的朋友可以和我交流阿。
Email: faisun@sina.com
现在本站的解决方法是:
如果浏览器支持 gzip ,则发送 Content-Encoding: gzip 文件头,并把预压缩 HTML 内容输出。
若不支持, 则用 Rewrite 的方式,转为 php 解压该HTML 文件。
1) PHP压缩保存: php 压缩时,应采用 gzencode() 函数压缩,客户端才能解码。
2) Apache 的 httpd.conf 设置:
#该虚拟主机 DocumentRoot D:/wwwroot/softpure.com
#对 D:/wwwroot/softpure.com/html 这个目录的规则(Rewrite 一般是相对目录编辑规则)
<Directory D:/wwwroot/softpure.com/html>
RewriteEngine On
# 非 IE 浏览器,并且
RewriteCond %{HTTP_USER_AGENT} !\bMSIE
# 空的 HTTP_USER_AGENT,或
RewriteCond %{HTTP_USER_AGENT} ="" [OR]
#不支持gzip 的浏览器
RewriteCond %{HTTP_USER_AGENT} Mozilla/4\.0[678]
#把 .html/.htm 文件,重写为 /htm/... ,使用伪静态,用 htm.php 读取>解压内容后输出。
RewriteRule (.+\.html?) /htm/$1 [L,NS]
#如果没有重写,则下条指令生效:发送 Content-Encoding: gzip 的 Header
Header append Content-Encoding "gzip"
</Directory>
- 上一篇: 站点改用纯静态生成技术
- 下一篇: 没有了