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 相关文章推荐
在项目中寻找代码的坏命名
Jul 14 PHP
php记录代码执行时间(实现代码)
Jul 05 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
百度地图API使用方法详解
Aug 25 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
PHP信号量基本用法实例详解
Feb 12 PHP
PHP Echo字符串的连接格式
Mar 07 PHP
Yii框架中sphinx索引配置方法解析
Oct 18 PHP
PHP面相对象中的重载与重写
Feb 13 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
May 23 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 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
Protoss兵种对照表
2020/03/14 星际争霸
下拉列表多级联动dropDownList示例代码
2013/06/27 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
php中上传文件的的解决方案
2018/09/25 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
PHP用swoole+websocket和redis实现web一对一聊天
2019/11/05 PHP
javascript 表单验证常见正则
2009/09/28 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
JS JQUERY实现滚动条自动滚到底的方法
2015/01/09 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
理解JavaScript表单的基础知识
2016/01/25 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
2017/03/30 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
python实现AES加密和解密
2019/03/27 Python
Python面向对象之继承和多态用法分析
2019/06/08 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
python+jinja2实现接口数据批量生成工具
2019/08/28 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
Python有参函数使用代码实例
2020/01/06 Python
Python使用Matlab命令过程解析
2020/06/04 Python
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
化学教学随笔感言
2014/02/19 职场文书
财政局个人年终总结
2015/03/03 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript