转自 腾讯Alloyteam Blog, 原文链接

前面了解了Web缓存的运行机制极其重要性之后,我们可以从以下这些方面去努力改善我们的站点,保证缓存被最有效的利用,达到最佳的性能。

同一个资源保证URL的稳定性

URL是浏览器缓存机制的基础,所以如果一个资源需要在多个地方被引用,尽量保证URL是固定的。同时,比较推荐使用公共类库,比如Google Ajax Library等,有利于最大限度使用缓存。

给Css、js、图片等资源增加HTTP缓存头,并强制入口Html不被缓存

对于不经常修改的静态资源,比如Css,js,图片等,可以设置一个较长的过期的时间,或者至少加上Last-Modified/Etag,而对于html页面这种入口文件,不建议设置缓存。这样既能保证在静态资源不变了情况下,可以不重发请求或直接通过304避免重复下载,又能保证在资源有更新的,只要通过给资源增加时间戳或者更换路径,就能让用户访问最新的资源。

减少对Cookie的依赖

过多的使用Cookie会大大增加HTTP请求的负担,每次GET或POST请求,都会把Cookie都带上,增加网络传输流量,导致增长交互时间;同时Cache是很难被缓存的,应该尽量少使用,或者这在动态页面上使用。

减少对HTTPS加密协议的使用

通过HTTPS请求的资源,默认是不会被缓存的,必须通过特殊的配置,才能让资源得到缓存。建议只对涉及敏感信息的请求使用HTTPS传输,其他类似Css,Js,图片这些静态资源,尽量避免使用。

多用Get方式请求动态Cgi

虽然POST的请求方式比Get更安全,可以避免类似密码这种敏感信息在网络传输,被代理或其他人截获,但是Get请求方式更快,效率更高,而且能被缓存,建议对于那些不涉及敏感信息提交的请求尽量使用Get方式请求。

动态CGI也是可以被缓存

如果动态脚本或CGI输入的内容在一定的时间范围内是固定的,或者根据GET参数相同,输入的内容相同,我们也认为请求是可以被缓存的,有以下几种方式,可以达到这个效果:

  • 1.让动态脚本定期将内容改变时导出成静态文件,Web直接访问带有Last-Modified/Etag的静态文件。
  • 2.开发者可以通过代码给动态脚本的响应头中添加Cache-Control: max-age,告诉浏览器在过期前可以直接使用副本。
  • 3.通过代码给动态脚本的响应头添加Last-Modified/Etag信息,浏览器再次请求的时候,可以通过解析If-Modified-Since/If-None-Match得知浏览器是否存在缓存,由代码逻辑控制是否返回304。

如何给站点增加缓存机制

HTTP请求/响应头中缓存报头对有效利用站点缓存,作为一个Web前端开发者,我要做什么呢?答案是:啥都不用做。不过要去推动Web运营人员、Web后端开发人员分别给服务器和动态脚本CGI增加合适的缓存报头。

服务器配置

Apache相关配置参考:mod_headersmod_headers

编写可缓存的动态脚本

服务器配置的方法比较简单通用,但是如果遇到没有权限修改服务器配置或者需要添加更细致的Expires/Cache-Control/Etag等信息时,不妨可以试试从代码层面去添加这些信息。不同语言写法实现略有不同,但思路都是一致的。可以在单独开辟一个独立模块,调用语言库提供的添加报头的接口,根据需要设置报头信息。当某个请求的动态脚本需要被缓存时,可以采用类似include,require等模块引用方式调用公共模块,实现缓存机制。
Php实现代码实例如下:

1
2
3
4
5
6
7
8
9
10
11
<?php
Header(“Cache-Control: must-revalidate”);
$offset = 60 * 60 * 24 * 3;
$ExpStr = “Expires: ” . gmdate(“D, d M Y H:i:s”, time() + $offset) . ” GMT”;
Header($ExpStr);
?>
<?php
Require(Cache.php)
// business code here
// todo
?>