因为Expires头使用一个特定的时间,它要求服务器和客户端的时钟严格同步。过期日期需要经常检查,一旦这一天到来了,还需要在服务器配置中提供一个新的日期。cache-Control使用max-age指令制定组件被缓存多久。它已秒为单位定义了一个更新窗。如果从组件被请求开始过去的秒数少于max-age,浏览器就使用缓存版本,这就避免了额外的Http请求。
为了确保用户能获取组件的最新版本,需要在所有HTML页面中修改组件的文件名。“最有效的解决方案是修改其所有链接,这样,全新的请求将从原始服务器下载最新的内容。”一种简单的解决方案就是为所有组件的文件名使用变量。
web客户端可以通过http请求与中accept-Encoding头来标识对压缩的支持。
Accept-Encoding:gzip,deflateContent-Encoding:gzip
图片和PDF不应压缩,因为它们本来就以及被压缩了。试图对他们压缩只会浪费CPU资源,还有可能会增加文件大小。配置gzip时使用的模块取决于Apache版本。apche1.3使用mod_gzip而apche 2.x使用mod_deflate。mod_gzeip提供了选项,可以将保存压缩过的内容自动保存在磁盘上,并在原内容发生变化时更新压缩过的内容。使用mod_gzip_can_negotiate和mod_gzip_update_static指令可以完成这个任务。
当用户使用代理访问网站时,情况会变得复杂。假设到达代理得一个请求来自于一个不支持gzip的浏览器,因此其缓存为空。代理会将请求转发到web服务器。此时服务器的响应是未经过压缩的。这个没有压缩的响应被代理缓存起来并发送给浏览器。假设第二个请求同一个URL但是来自于一个支持gzip的浏览器。代理会将其缓存未压缩的内容进行响应,这个就失去的压缩的机会。假如顺序与例子相反,情况可能更严重。解决问题的方法是在web服务器的响应中添加Vary头。web服务器可以告诉代理根据一个或多个请求头来改变缓存的响应。犹豫压缩的决定是基于Accept-Encoding请求头的,因此需要在服务器的Vary响应头中包含Accept-Encoding。默认情况下,mod_gzip会向所有响应添加Vary:Accept-Encoding的头,以驱使代理执行正确的操作。
以上内容摘抄于《高性能网站建设指南》