如何建设高性能网站--http篇/缓存组件

如果浏览器在其缓存中保留了组件的一个副本,但并不确定它是否仍然有效,就会生成一个get请求。如果确认缓存的副本是有效的,那么就会使用它,这就会得到更小的响应和更快的用户体验。
那么浏览器是如何确定缓存副本的有效性来自其最后的修改时间。基于响应中的Last-Modified头,浏览器就可知道组件的最后修改时间。浏览器会使用If-Modified-Since头将最后修改的时间发送给服务器。
如上的一种确定缓存副本的有效性可以使页面加载的更快,但仍然需要客户端和服务端之间进行一次往返确认,以执行有效性检查。
如何配置组件,使其能够最大化的利用浏览器的缓存能力改善页面性能?值得思考。
添加Expires头,web服务器使用Expires头来告诉web客户端它可以使用一个组件的当前副本,知道指定的时间为止。那么浏览器就不会进行任何HTTP请求。HTTP规范称:”在这一日期/时间之后,响应将被认定是无效的“。

Expires:Mon ,15 Apr 2024 20:00:00 GMT
//这是一个有效期非常长久的Expires头

Expires头使用了一个特定的时间,它要求服务器和客户端的时钟严格同步,过期的日期还有经常去检查,所以HTTP1.1推出了Cache-Control。
HTTP1.1
Cache-Control使用max-age指令组件被缓存多久。它是用秒单位定义了一个更新窗。如果从组件被请求开始过去的秒数少于max-age,浏览器就会使用缓存的版本,这就避免了额外的HTTP请求。

Cache-Control:max-age=315360000

有些浏览器并不支持HTTP1.1,那么如何做到兼容呢?
Expires头和Cache-Control一起使用。但HTTP规范规定max-age指令将重写Expires头。所以要在服务器做一个配置通过Expires-Default指令来完成。
如mod_expiresApache模块

<FilesMatch "\.(gif|jpg|npg|css)$">
	ExpiresDefault "access plus 10 years"
</FilesMatch>

时间可以年月日分秒来设置。
那已经配置为可以由浏览器代理缓存,当这些组件改变的时候用户如何获得更新的呢?值得思考。
修改文件名用来更新组件。比如我们打包项目的时候,让所以的文件都生成hash值,每一次打包所生成的hash值是不一样的。
当然还可在在页面当中嵌套每一次打包的版本号。

猜你喜欢

转载自blog.csdn.net/Miss_hhl/article/details/103774449