PHP+.htaccess 实现全站静态 HTML 文件 GZIP 压缩传输 (一)
PHP+.htaccess 实现全站静态 html 文件 GZIP 压缩传输(一)
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 模式打开
RewriteEngineOn
RewriteBase/
RewriteRuleindex2\.html l.php?fn=index2.html
1.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');
}
}
elseif($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');
}
}
}
?>
$rfile=addslashes(dirname(dirname(__FILE__))).'/'.'./httpdocs/'.$_REQUEST['fn'];
echo READ_FILE_CONTENTS($rfile);
functionREAD_FILE_CONTENTS($file)
{
if(!function_exists("file_get_contents"))returnfile_get_contents($file);
$ifile=fopen($file,"r");
$contents=false;
if($ifile)while(!feof($ifile))$contents.=fgets($ifile);
fclose($ifile);
return$contents;
}
?>
// Compress buffered output if required and send to browser
if($do_gzip_compress)
{
/$/Borrowedfromphp.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}, 还望高手赐教
来源: https://www.php1.cn/detail/php-b19eb7afc4.html