gzip压缩传输的几种配置方法
gzip是一种网络数据压缩传输技巧,可以让我们的带宽省70%左右,这可是一个非常可观的东西了,下面我来给大家整理几种gzip配置方法吧.
第一种方案:在.htaccess 中添加如下代码:
- AddHandlerapplication/x-httpd-php.css.html.js
- #这是添加你要压缩的类型
- php_valueauto_prepend_file“/home/a4284418/public_html/gzip.php”
- #这是你给这些类型增加一个自动运行的php代码,后面一定要填你空间的绝对地址
gzip.php,代码如下:
- <?php
- ob_start(“ob_gzhandler”);
- ob_start(“compress”);
- //如果出现css不能解释,只显示网页,请加入下面的红色代码,去掉注释符
- /*
- $pathinfo=pathinfo($_SERVER[PHP_SELF]);
- switch($pathinfo['extension']){
- case“css”:header(“Content-type:text/css”);
- break;//phpfensi.com
- case“html”:header(“Content-type:text/html”);
- break;
- case“js”:header(“Content-type:text/javascript”);
- break;
- default:break;
- }
- */
- ?>
第二种方案:此种方案是gzip的升级版,可以将gzip的压缩文件缓存下来,避免重复压缩,在.htaccess 中添加:
htaccess RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L],代码如下:
- <?php
- //htaccessRewriteRule(.*.css$|.*.js$)gzip.php?$1[L]
- //项目根路径
- define(‘ABSPATH’,dirname(__FILE__).’/');
- //Gzip压缩开关
- $cache=true;
- //存放gz文件的目录,确保可写
- $cachedir=‘gzip-cache/’;
- if(!is_dir(ABSPATH.$cachedir))
- {
- mkdir(ABSPATH.$cachedir);
- }
- //判断是否支持gzip
- $gzip=strstr($_SERVER['HTTP_ACCEPT_ENCODING'],‘gzip’);
- $deflate=strstr($_SERVER['HTTP_ACCEPT_ENCODING'],‘deflate’);
- //看浏览器是否支持gzip否则就是deflate,再就是none
- $encoding=$gzip?‘gzip’:($deflate?‘deflate’:‘none’);
- if(!isset($_SERVER['QUERY_STRING']))exit();
- //$key=array_shift(explode(‘?’,$_SERVER['QUERY_STRING']));
- //$key=str_replace(‘../’,”,$key);
- $key=basename($_SERVER['QUERY_STRING']);
- //文件的绝对路径
- $filename=ABSPATH.$_SERVER['QUERY_STRING'];
- $symbol=’^';
- $rel_path=str_replace(ABSPATH,”,dirname($filename));
- $namespace=str_replace(‘/’,$symbol,$rel_path);
- $cache_filename=ABSPATH.$cachedir.$namespace.$symbol.basename($filename).’.gz’;//生成gz文件路径
- $type=”Content-type:text/html”;//默认的类型信息
- $pathInfo=pathinfo($filename);
- //根据后缀判断文件类型信息
- $ext=$pathInfo['extension'];
- switch($ext){
- case‘css’:
- $type=”Content-type:text/css”;
- break;
- case‘js’:
- $type=”Content-type:text/javascript”;
- break;
- default:
- exit();
- }
- if($cache)
- {
- if(file_exists($cache_filename))
- {
- //假如存在gz文件
- $mtime=filemtime($cache_filename);
- $gmt_mtime=gmdate(‘D,dMYH:i:s’,$mtime).‘GMT’;
- //读取gz文件输出
- $content=file_get_contents($cache_filename);
- header(“Last-Modified:”.$gmt_mtime);
- header(“Expires:“);
- header(“Cache-Control:“);
- header(“Pragma:“);
- header($type);
- header(“Tips:NormalRespond(Gzip)”);
- header(“Content-Encoding:gzip”);
- echo$content;
- }elseif(file_exists($filename))
- {
- //没有对应的gz文件
- $mtime=mktime();
- $gmt_mtime=gmdate(‘D,dMYH:i:s’,$mtime).‘GMT’;
- $content=file_get_contents($filename);//读取文件
- $content=gzencode($content,9,$gzip?FORCE_GZIP:FORCE_DEFLATE);//压缩文件内容
- header(“Last-Modified:”.$gmt_mtime);
- header(“Expires:“);
- header(“Cache-Control:“);
- header(“Pragma:“);
- header($type);
- header(“Tips:BuildGzipFile(Gzip)”);
- header(“Content-Encoding:”.$encoding);
- header(‘Content-Length:‘.strlen($content));
- if($fp=fopen($cache_filename,‘w’))
- {
- //写入gz文件,供下次使用
- fwrite($fp,$content);
- fclose($fp);
- }
- echo$content;
- }else{
- header(“HTTP/1.0404NotFound”);
- }
- }else
- {//处理不使用Gzip模式下的输出。原理基本同上
- if(file_exists($filename))
- {
- $mtime=filemtime($filename);
- $gmt_mtime=gmdate(‘D,dMYH:i:s’,$mtime).‘GMT’;
- header(“Last-Modified:”.$gmt_mtime);
- header(“Expires:“);
- header(“Cache-Control:“);
- header(“Pragma:“);
- header($type);
- header(“Tips:NormalRespond”);
- $content=readfile($filename);
- echo$content;
- }else
- {
- header(“HTTP/1.0404NotFound”);
- }
- }
- ?>
第三种方案:直接修改服务器环境.
1,httpd.conf修改
LoadModule headers_module modules/mod_headers.so 开启
LoadModule deflate_module modules/mod_deflate.so 添加
2,Apache2.2\conf\extra\httpd-vhosts.conf 的默认虚拟主机里加如下代码:
- <Location“/”>
- SetOutputFilterDEFLATE
- BrowserMatch^Mozilla/4gzip-only-text/html
- BrowserMatch^Mozilla/4\.0[678]no-gzip
- BrowserMatch\bMSIE!no-gzip!gzip-only-text/html
- SetEnvIfNoCaseRequest_URI\.(?:gif|jpe?g|png)$no-gzipdont-vary
- HeaderappendVaryUser-Agentenv=!dont-vary
- </Location>
例子:
- <VirtualHost127.0.0.3>
- DocumentRoot‘D:/xampp/htdocs/wmt’
- ServerName127.0.0.3
- DirectoryIndexindex.phpindex.html
- <Directory“D:\xampp\htdocs\wmt”>
- OptionsIndexesFollowSymLinksIncludesExecCGI
- AllowOverrideAll
- OrderAllow,Deny
- Allowfromall
- </Directory>
- <Location“/”>
- SetOutputFilterDEFLATE
- BrowserMatch^Mozilla/4gzip-only-text/html
- BrowserMatch^Mozilla/4\.0[678]no-gzip
- BrowserMatch\bMSIE!no-gzip!gzip-only-text/html
- SetEnvIfNoCaseRequest_URI\.(?:gif|jpe?g|png)$no-gzipdont-vary
- HeaderappendVaryUser-Agentenv=!dont-vary
- </Location>
- </VirtualHost>
nginx gzip压缩,nginx 配置gzip段如下:
- gzipon;
- gzip_min_length1k;
- gzip_buffers1664k;
- gzip_http_version1.1;
- gzip_comp_level6;
- gzip_typestext/plainapplication/x-javascripttext/cssapplication/xml;
- gzip_varyon;
Nginx的压缩输出有一组gzip压缩指令来实现,相关指令位于http{….}两个大括号之间.
gzip on;:该指令用于开启或关闭gzip模块(on/off)
gzip_min_length 1k;:设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。
gzip_buffers 4 16k;:设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。
gzip_http_version 1.1;:识别http的协议版本(1.0/1.1)
gzip_comp_level 2;:gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
gzip_types text/plain application/x-javascript text/css application/xml:匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的.
gzip_vary on;:和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩.
apache gzip压缩,代码如下:
- LoadModuledeflate_modulemodules/mod_deflate.so
- <IfModulemod_deflate.c>
- SetOutputFilterDEFLATE
- DeflateCompressionLevel9
- AddOutputFilterByTypeDEFLATEtext/htmltext/cssimage/gifimage/jpegimage/pngapplication/x-javascript
- AddOutputFilterByTypeDEFLATEapplication/ms*application/vnd*application/postscriptapplication/javascript
- AddOutputFilterByTypeDEFLATEapplication/x-httpd-phpapplication/x-httpd-fastphp
- BrowserMatch^Mozilla/4gzip-only-text/html
- BrowserMatch^Mozilla/4.0[678]no-gzip
- BrowserMatchbMSIE!no-gzip!gzip-only-text/html
- </IfModule>
热门评论