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 模式打开
- RewriteEngine On
- RewriteBase /
- RewriteRule index2\.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');
- }
- }
- 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');
- }
- }
- }
- ?>
- $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;
- }
- ?>
- // 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}, 还望高手赐教
来源: https://www.php1.cn/detail/php-b19eb7afc4.html