压缩是节省带宽并加快站点速度的一种简单有效的方法。(由于较旧的浏览器存在问题,建议您在加速JavaScript时建议使用gzip压缩时,需要三思。)
但现在是21世纪。我的大部分流量都来自现代浏览器,坦率地说,我的大多数用户都非常精通技术。我不想放慢其他人的脚步,因为有人在Windows 95上的IE 4.0上苦苦挣扎。Google和Yahoo使用gzip压缩。需要使用现代浏览器来享受现代Web内容和现代Web速度-gzip编码就是如此。设置方法如下。
一、先等等,我们为什么要这样做?
在我们开始之前,我应该解释什么是内容编码。当您请求www.yahoo.com/index.html 之类的文件时,浏览器将与Web服务器对话。对话有点像这样
浏览器:嘿,给我/index.html
服务器:好的,让我看看index.html是否在附近……
服务器:找到了!这是您的 response code (200 OK),我正在发送文件。
浏览器:100KB?太好了…等待中,等待中…确定,它已加载。
当然,实际的headers 和 protocols 更为正式(如果您愿意,可以使用Live HTTP Headers进行监视)。 但是,它奏效了,您得到了想要的文件。
二、那么还有什么问题呢?
现在,该系统可以运行,但是效率不高。 100KB是很多文本,坦率地说,HTML是多余的。每个<html>,<table>和<div>标记都有一个几乎相同的结束标记。在整个文档中重复使用单词。用任何方式对其进行切片,HTML(及其强大的表亲XML)都不是精简的。
当文件太大时,怎么办呢?压缩它!!!
如果我们可以将.zip文件(而不是普通的index.html)发送到浏览器(index.html.zip),则可以节省带宽和下载时间。浏览器可以下载压缩的文件,将其解压缩,然后将其显示给用户,因为页面加载速度很快。浏览器与服务器的对话可能看起来像这样:
浏览器:嘿,我可以获取index.html吗?如果有的话,我将下载压缩版本。
服务器:让我找到档案...是的,就在这里。然后您将使用压缩版本。
服务器:好的,我找到了index.html(确定为200),正在将其压缩并发送过来。
浏览器:太好了!只有10KB。我将其解压缩并显示给用户。
公式很简单:文件较小=>下载速度更快=>用户满意。
不相信我吗?压缩后,yahoo主页的HTML部分从101kb变为15kb:
三、一些小的细节
这种交换的棘手部分是浏览器和服务器知道可以发送压缩文件了。该协议分为两部分
- 浏览器发送一个标头,告诉服务器它接受压缩的内容(gzip和deflate是两种压缩方案):Accept-Encoding:gzip,deflate
- 如果实际压缩了内容,服务器将发送响应:Content-Encoding:gzip 如果服务器未发送 content-encoding 响应头,则表示文件未压缩(许多服务器上的默认设置)。 “Accept-encoding” header 只是浏览器的请求,不是需求。如果服务器不想发送回压缩的内容,则浏览器必须处理繁重的常规版本。
四、设置服务器
“好消息”是我们无法控制浏览器。它要么发送Accept-encoding:gzip,deflate标头,要么不发送。
我们的工作是配置服务器,以便在浏览器可以处理的情况下返回压缩的内容,从而为每个人节省带宽(并为我们提供满意的用户)。
对于IIS,请在设置中启用压缩。
在Apache中,启用输出压缩非常简单。将以下内容添加到您的.htaccess文件中:
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
# Or, compress certain file types by extension:
<files *.html>
SetOutputFilter DEFLATE
</files>
Apache实际上有两个压缩选项:
- mod_deflate易于设置并且是标准的。
- mod_gzip似乎更强大:您可以预压缩内容。 Deflate 是快速且有效的,所以我使用它。如果你愿意的话也可以使用mod_gzip。无论哪种情况,Apache都会检查浏览器是否发送了“ Accept-encoding” header,并返回文件的压缩版本或常规版本。但是,某些较旧的浏览器可能会出现问题,并且可以添加一些特殊指令来更正此问题。
如果您无法更改.htaccess文件,则可以使用PHP返回压缩的内容。给您的HTML文件一个.php扩展名,并将此代码添加到顶部:
在PHP中:
<?php if(substr_count($ _ SERVER ['HTTP_ACCEPT_ENCODING'],'gzip'))ob_start(“ ob_gzhandler”);否则ob_start(); ?>
我们检查“ Accept-encoding” header并返回文件的压缩版本(否则为常规版本)。这几乎就像构建您自己的Web服务器一样。但实际上,如果可以,建议使用Apache压缩输出,以免乱弄你的文件。
五、验证压缩
配置服务器后,请检查确实在提供压缩内容。
- 在线:使用在线gzip测试来检查您的页面是否被压缩。
- 在浏览器中:在Chrome中,打开“开发工具”>“网络”标签(Firefox / IE将与此类似)。刷新页面,然后单击页面本身的网络行(即www.google.com)。标头“ Content-encoding:gzip”表示内容已压缩发送。
单击“使用大行”图标以获取更多详细信息,包括压缩的传输大小和真实内容大小。
移步看看这个让人惊叹的结果。 百度主页从200k缩小到60k左右,大小减少了70%以上。
六、测试一些例子
现有已经设置了的一些页面和一个可下载的示例:
- index.html –无显式压缩(在此服务器上,默认情况下我使用的是压缩)。
- index.htm –使用* .htm作为规则,使用Apache .htaccess进行显式压缩
- index.php –使用PHP标头明确压缩 随时下载文件,将它们放在你的服务器上并进行设置调整。
注意事项
尽管看起来很令人兴奋,但HTTP压缩并非一帆风顺。注意事项:
- 较旧的浏览器:某些浏览器可能仍无法处理压缩内容。如果您的站点绝对必须在Windows 95上使用Netscape 1.0,则您可能不想使用HTTP压缩。 Apache mod_deflate具有一些规则,可避免对较旧的浏览器进行压缩。
- 已经压缩的内容:大多数图像,音乐和视频已经被压缩。不要浪费时间再次压缩它们。实际上,您可能只需要压缩“三大文件”(HTML,CSS和Javascript)。
- CPU负载:动态压缩内容会占用CPU时间并节省带宽。考虑到压缩速度,通常这是一个很大的折衷。有一些方法可以预压缩静态内容并通过压缩版本发送。这需要更多配置。即使不可能,压缩输出仍可能是净赢。考虑到Web上的关注时间短,使用CPU周期获得更快的用户体验是非常值得的。 启用压缩是提高网站性能的最快方法之一。这样设置能让用户感受更好的用户体验。