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 相关文章推荐
php中取得URL的根域名的代码
Mar 23 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
Apr 02 PHP
解析strtr函数的效率问题
Jun 26 PHP
PHP自动生成表单代码分享
Jun 19 PHP
Codeigniter的dom类用法实例
Jun 26 PHP
php实现微信公众号无限群发
Oct 11 PHP
PHP中的随机性 你觉得自己幸运吗?
Jan 22 PHP
PHP书写格式详解(必看)
May 23 PHP
thinkPHP自动验证机制详解
Dec 05 PHP
如何判断php mysqli扩展类是否开启
Dec 24 PHP
PHP PDOStatement::errorInfo讲解
Jan 31 PHP
thinkphp5框架实现的自定义扩展类操作示例
May 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
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
Laravel使用Queue队列的技巧汇总
2019/09/02 PHP
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
js实现点击注册按钮开始读秒倒计时的小例子
2013/05/11 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
2013/12/11 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
ionic实现底部分享功能
2017/05/11 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
2019/08/02 jQuery
jQuery实现简单评论区功能
2020/10/26 jQuery
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
python实现redis三种cas事务操作
2017/12/19 Python
解决Python运行文件出现out of memory框的问题
2018/12/03 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
sqlalchemy实现时间列自动更新教程
2020/09/02 Python
《忆江南》教学反思
2014/04/07 职场文书
个人专业技术总结
2015/03/05 职场文书
工程技术员岗位职责
2015/04/11 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL