PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)


Posted in PHP onFebruary 15, 2007

apache的强大终于超出了我的想象,仅仅蜻蜓点水般触及了一点php皮毛,这点皮毛就在我原有的知识库基础上爆炸开来,好像PN结的“雪崩击穿”一样,让我想到了多种技术结合无限的应用前景。

由于九州未来的服务器限制流量,那么减少流量负载也就能减少金钱支出。
如何减少流量,最方便的办法就是用Gzip压缩,这个apache的gzip压缩是靠一个叫做zlib的类库和gzip的模块(mod_gzip.c)完成的,这玩意专门有一帮牛人研究,因为gzip本身就大名鼎鼎的,并且具有高压缩率开源的压缩原理,所以我们的开源apache才会采用这种开源的压缩技术。

恩,这个.htaccess也是apache的一个牛比东西,太强大了,也是根据你的apache安装了什么模块而决定你这个文件里面可以写什么东西,比如你安装了URL重写模块(Module mod_rewrite.c)的话你就可以写一些URL重写代码来实现你的文件重写。

知识普及完毕。。。。

进入正题。

如何让自己的全站的真实的静态的html文件,变成gzip传输的呢?
为了理解方便,我给大家写了一个简单的php程序。
首先我们建立一个采用gzip压缩算法的l.php,在该文件中读入xxx.html并显示出来,然后再在.htaccess里面重写xxx.html到1.php就可以了。简单吧。由于我们的服务器认为.htaccess的优先级最高,所以访问xxx.html的时候没有访问到这个静态文件,反而访问到了1.php.

下面是我的代码:(读入index2.html,然后重写之)
.htaccess:

# 将 RewriteEngine 模式打开  
RewriteEngine On  
RewriteBase /  
RewriteRule index2\.html l.php?fn=index2.html 

1.php

<?php  
   $phpver = phpversion();     $useragent = (isset($_SERVER["HTTP_USER_AGENT"]) ) ? $_SERVER["HTTP_USER_AGENT"] : $HTTP_USER_AGENT;  
   if ( $phpver >= '4.0.4pl1' && ( strstr($useragent,'compatible') || strstr($useragent,'Gecko') ) )  
   {  
       if ( extension_loaded('zlib') )  
       {  
           ob_start('ob_gzhandler');  
       }  
   }  
   else if ( $phpver > '4.0' )  
   {  
       if ( strstr($HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING'], 'gzip') )  
       {  
           if ( extension_loaded('zlib') )  
           {  
               $do_gzip_compress = TRUE;  
               ob_start();  
               ob_implicit_flush(0);  
               header('Content-Encoding: gzip');  
           }  
       }  
   }  
?>  
<?php  
$rfile = addslashes(dirname(dirname(__FILE__))).'/'.'./httpdocs/'.$_REQUEST['fn'];  
echo READ_FILE_CONTENTS($rfile);  
function READ_FILE_CONTENTS($file)  
{  
   if(!function_exists("file_get_contents"))return file_get_contents($file);  
   $ifile = fopen($file,"r");  
   $contents = false;  
   if($ifile) while (!feof($ifile)) $contents .= fgets($ifile);  
   fclose($ifile);  
   return $contents;  
}  
?>  
<?php  
// Compress buffered output if required and send to browser  
if ( $do_gzip_compress )  
{  
   //  
   // Borrowed from php.net!  
   //  
   $gzip_contents = ob_get_contents();  
   ob_end_clean();  
   $gzip_size = strlen($gzip_contents);  
   $gzip_crc = crc32($gzip_contents);  
   $gzip_contents = gzcompress($gzip_contents, 9);  
   $gzip_contents = substr($gzip_contents, 0, strlen($gzip_contents) - 4);  
   echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";  
   echo $gzip_contents;  
   echo pack('V', $gzip_crc);  
   echo pack('V', $gzip_size);  
}  
exit;  
?> 

实际上这个东西能用更好的方法解决,就是用这个

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /xxx/xxx.php [L]

但是我还没研究出来怎么处理这个%{REQUEST_FILENAME},还望高手赐教。

PHP 相关文章推荐
js下函数般调用正则的方法附代码
Jun 22 PHP
php将时间差转换为字符串提示
Sep 07 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
Jun 05 PHP
PHP 安全检测代码片段(分享)
Jul 05 PHP
Symfony2安装第三方Bundles实例详解
Feb 04 PHP
Yii实现Command任务处理的方法详解
Jul 14 PHP
php抽象方法和抽象类实例分析
Dec 07 PHP
深入解析PHP中SESSION反序列化机制
Mar 01 PHP
PHP 年月日的三级联动实例代码
May 24 PHP
Joomla框架实现字符串截取的方法示例
Jul 18 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 PHP
php调用mysql存储过程
Feb 14 #PHP
mysql中存储过程、函数的一些问题
Feb 14 #PHP
让PHP支持页面回退的两种方法[转]
Feb 14 #PHP
浅析PHP水印技术
Feb 14 #PHP
解决GD中文乱码问题
Feb 14 #PHP
使用apache模块rewrite_module (转)
Feb 14 #PHP
用PHP的ob_start();控制您的浏览器cache!
Feb 14 #PHP
You might like
ASP和PHP都是可以删除自身的
2007/04/09 PHP
Yii2框架自定义验证规则操作示例
2019/02/08 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
动态添加js事件实现代码
2009/03/12 Javascript
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
js捕获鼠标右键菜单中的粘帖事件实现代码
2013/04/01 Javascript
使用javascript实现ListBox左右全选,单选,多选,全请
2013/11/07 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
javascript实现雪花飘落效果
2020/08/19 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python网络编程学习笔记(六):Web客户端访问
2014/06/09 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
2018/12/27 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
pygame实现弹球游戏
2020/04/14 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
大学新生军训个人的自我评价
2013/10/03 职场文书
军训自我鉴定
2014/01/22 职场文书
教师校本培训方案
2014/02/26 职场文书
学校课外活动总结
2014/05/08 职场文书
小学关爱留守儿童活动方案
2014/08/25 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android
Java基础——Map集合
2022/04/01 Java/Android