44 条评论

让JS和CSS也支持Gzip压缩

阳光曾经写在以前的文章中写过“开启GZIP压缩功能为wordpress提速”来加速网页的显示速度不过对于CSS和JS,默认是不进行压缩的,之后阳光为了让它也对JS和CSS进行压缩从网上找了很多资料,终于有一个是能用的的现在分享给大家。

让JS和CSS支持Gzip压缩

  • 搜索了一下,有很多方法可以实现,但都有一个严重的BUG,该死的IE6对Gzip的支持不是很好,如果对CSS、JS进行Gzip压缩,会使部分 JS失效或者CSS无法加载,Dream试了下,只要一启用Gzip,Wordpress就处于裸奔状态,CSS完全失效,而且还一大堆JS错误。既然 IE6不支持,那我们就绕过它(惹不起我还躲不起吗?)经过一下午的折腾,终于搞定了这问题。

    首先新建GZIP.PHP的文件

  • 在你网站的根目录下新建一名字为gzip.php的文件,代码如下。代码有点长要拷贝完整才行的。

?php
define(‘ABSPATH’, dirname(__FILE__).’/');
$cache = true;//Gzip压缩开关
$cachedir = ‘wp-cache/’;//存放gz文件的目录,确保可写

$gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], ‘gzip’);

$deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], ‘deflate’);
$encoding = $gzip ? ‘gzip’ : ($deflate ? ‘deflate’ : ‘none’);

if(!isset($_SERVER['QUERY_STRING']))
exit();

$key=array_shift(explode(‘?’, $_SERVER['QUERY_STRING']));
$key=str_replace(‘../’,”,$key);

$filename=ABSPATH.$key;

$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”; //默认的类型信息

$ext = array_pop(explode(‘.’, $filename));//根据后缀判断文件类型信息
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, d M Y H:i:s’, $mtime) . ‘ GMT’;

if( (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && array_shift(explode(‘;’, $_SERVER['HTTP_IF_MODIFIED_SINCE'])) ==  $gmt_mtime))
{

// 浏览器cache中的文件修改日期是否一致,将返回304
header (“HTTP/1.1 304 Not Modified”);
header(“Expires: “);
header(“Cache-Control: “);
header(“Pragma: “);
header($type);
header(“Tips: Cache Not Modified (Gzip)”);
header (‘Content-Length: 0′);

}
else
{

//读取gz文件输出
$content = file_get_contents($cache_filename);
header(“Last-Modified:” . $gmt_mtime);
header(“Expires: “);
header(“Cache-Control: “);
header(“Pragma: “);
header($type);
header(“Tips: Normal Respond (Gzip)”);
header(“Content-Encoding: gzip”);
echo $content;
}

}
else if(file_exists($filename))
{ //没有对应的gz文件

$mtime = mktime();
$gmt_mtime = gmdate(‘D, d M Y H: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: Build Gzip File (Gzip)”);
header (“Content-Encoding: ” . $encoding);
header (‘Content-Length: ‘ . strlen($content));
echo $content;

if ($fp = fopen($cache_filename, ‘w’))
{//写入gz文件,供下次使用
fwrite($fp, $content);
fclose($fp);
}

}
else
{
header(“HTTP/1.0 404 Not Found”);
}
}
else
{ //处理不使用Gzip模式下的输出。原理基本同上
if(file_exists($filename))
{
$mtime = filemtime($filename);
$gmt_mtime = gmdate(‘D, d M Y H:i:s’, $mtime) . ‘ GMT’;

if( (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && array_shift(explode(‘;’, $_SERVER['HTTP_IF_MODIFIED_SINCE'])) ==  $gmt_mtime))
{
header (“HTTP/1.1 304 Not Modified”);
header(“Expires: “);
header(“Cache-Control: “);
header(“Pragma: “);
header($type);
header(“Tips: Cache Not Modified”);
header (‘Content-Length: 0′);

}
else
{
header(“Last-Modified:” . $gmt_mtime);
header(“Expires: “);
header(“Cache-Control: “);
header(“Pragma: “);
header($type);
header(“Tips: Normal Respond”);
$content = readfile($filename);
echo $content;
}
}
else
{
header(“HTTP/1.0 404 Not Found”);
}
}

?>

然后我们修改.htaccess

在你网站的根目录下的.htaccess中添加以下代码,如果.htaccess不存在则新建一个

RewriteCond %{HTTP:User-Agent} !MSIE [5-6]
RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L]
  • 这段代码的意思是判断当前浏览器是否为IE5-6(虽然现在很少人用IE5,不过为保险起见还是加上吧),如果不是则对CSS/JS启用Gzip压缩。
  • 最后我们通过Firefox插件YSlow插件来检测下启用GZIP前后的访问速度。YSlow的使用方式和下载地址在阳光以前的文章中有介绍过的:

YSlow的使用方式请点击这里:用YSlow对网站体检—附中文版下载





你可能也会喜欢这些文字

发表在: WordPress 标签为: , . - 永久链接.

让JS和CSS也支持Gzip压缩》有 44 条评论

  1. erone 说:

    我承认,我没有在这在很长一段时间的网页… …不过这是另一种喜悦,看到它是如此的一个重要课题和这么多,甚至专业人士忽略。我感谢您的帮助使人们更加认识到可能出现的问题。

  2. blac 说:

    按照这个方法吧我的博客也gzip了一下、效果不是很明显呀,虽然说压缩率达到了60%、不知道什么情况?

  3. Dboll 说:

    Gzip压缩功能相当的强大呀、我的博客压缩到79%了。

  4. tatto 说:

    gzip压缩功能相当的不错哇、我博客的压缩率达到70%了都

  5. weight 说:

    i can has cheeseburger?

  6. kids yoga 说:

    来www.hiadmin.org成习惯了,感谢博主的无私奉献

  7. Rent A Car 说:

    回去改装下我的博客

  8. 步鞋 说:

    很好的文章,特来顶一下!!!希望以后有更多精彩的内容

  9. vfglpdusyar 说:

    回去改装下我的博客

  10. dfpbrmgzdg 说:

    找了好久才找到你这里来

  11. xupczunj 说:

    gzip压缩率还不错了

  12. dfobnvw 说:

    学习中,回家改造下

  13. imengs 说:

    为什么我用你的方法压缩的js 和 css 显示都是乱码,乱码之后网页内容是有了,可是效果全没了,只能把压缩又关掉了,杯具了…

  14. alexin 说:

    好像代码有误哦

  15. Dream 说:

    嘿嘿,博主你偷学我的方法哦。

  16. Abercromb 说:

    试用了一下,还是有效果的,大家支持一下

  17. Firm 说:

    这样速度的确会快很多

  18. 看文章 。。。o(∩_∩)o 哈哈

  19. 什么 说:

    朋友推荐我来看看你写了点什么(http://shen.me)

  20. 老张博客 说:

    Gzip压缩
    是提速的一个重要因素。

  21. 小周博客 说:

    我感觉就普通gzip压缩就行了。捣鼓麻烦

  22. zen cart 说:

    貌似有点复杂!

  23. GoFreeApp 说:

    俺用nginx开启了gzip,不知道和这个用php开启有没有什么区别

  24. lx 说:

    博主换友情链接么??

    我的博客,英文站推广交流 http://wobole.cn

    PR3,建立2年

  25. 减榜 说:

    呵呵,博主写得很精彩!来看看。

  26. 无赖 说:

    “网站的根目录下的.htaccess”,晕,Windows主机岂不是无望了???= =!

  27. 郑州seo 说:

    有301的文章吗?最近要改改网站

  28. 飞晏 说:

    WordPress众多的JS可以压缩一下了

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>