·您的位置: 首页 » 纯粹博客 » 纯粹日志 » 在apache中解压预压缩的静态文件

在apache中解压预压缩的静态文件

作者:faisun 发布日期:2007-04-25

对于静态的 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>

-= 文章分类 =-
文 章 搜 索
关键词:
类型:
范围:
最新发表
纯粹空间 softpure.com
Copyright © 2006-2008 暖阳制作 版权所有
QQ: 15242663 (拒绝闲聊)  Email: faisun@sina.com
 纯粹空间 - 韩国酷站|酷站欣赏|教程大全|资源下载|免费博客|美女壁纸|设计素材|技术论坛   Valid XHTML 1.0 Transitional
百度搜索 谷歌搜索 Alexa搜索 | 粤ICP备06033747号