HTTP 笔记与总结(7)HTTP 缓存(配合 Apache 服务器)

在网络上,有一些缓存服务器,另外浏览器自身也有缓存功能。

例如:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<img src="./a.jpg" alt="">
</body>
</html>

第 1 次访问该页面时,正常下载图片,返回值是 200:  

响应头的抓包分析:

 

 

基于一个前提——图片不会经常改动,服务器在返回 200 的同时,还返回该图片的特征值(签名 ETag),当浏览器再次访问该图片时,就回去服务器椒盐 ETag,如果图片没有变化,则直接使用缓存中的图片,减轻了服务器的负担:

响应头的抓包分析:

 自(If-Modified-Since 的)时间点后图片修改过,则重新请求;如果图片最新的签名(ETag)和上次返回(If-None-Match)的值不匹配,则重新请求。此时响应值是 304,浏览器从本地取缓存,节省了图片在网络上传输的时间。

请求头的 If-None-Match 和 响应头的 Etag 对应,请求头的 If-Modified-Since 和 响应头的 Last-Modified 对应。

 

 

HTTP Cache-Controll 请求头信息

在大型网站中,如何处理主服务器和缓存服务器之间的问题:要不要缓存和缓存多久,需要用到 HTTP Cache-Controll 请求头信息

步骤:

① 主服务器需要开启 mod_expires 模块(Apache 服务器)

利用该扩展来控制图片、css、html 等文件是否缓存以及缓存的生命周期,

 

② 在当前目录下新建 .htaccess 文件

语法

ExpiresDefault "<base> [plus] {<num> <type>}*"
ExpiresByType type/encoding "<base> [plus] {<num> <type>}*" 

 

后面 4 个参数分别表示

base:基于哪个时间点来计算缓存有效期,有两个值:access/now,now 等价于 access,表示基于请求响应的那一瞬间;另一个值是 modification,表示被请求文件的最后修改日期,比如被修改后的一周内仍然有效

 

plus:可选参数

 

num:缓存时间的大小(30)

 

type:缓存时间的单位(天)

 

【例】

给 jpg 图片设置 1 个月的生存周期  

.htaccess:

ExpiresActive On
ExpiresByType image/jpeg "access plus 1 month"

执行页面,抓包分析:

  

如果在集群环境中,缓存服务器得到此图片,将会认为在一个月内有效,减轻了主服务器的负担。

 

 

设置服务器不让用缓存

比如有些个人信息不允许缓存服务器缓存,必须到主服务器请求。

可以利用 apache 服务器的 mod_headers 模块 

 

在 .htaccess 中追加信息

.htaccess:

ExpiresActive On
ExpiresByType image/jpeg "access plus 1 month"

<FileMatch "\.(gif|png)$">
header set Cache-Controll "no-store,must-revalidate"
<FileMatch>

使用正则表达式,设置当图片是 gif 或 png 格式的图片时,不允许缓存。

 

修改 cache-01.html  

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<img src="./a.jpg" alt="">
	<img src="./php.gif" alt="">
</body>
</html>

执行文件,抓包分析:

  

多次刷新页面,php.gif 的响应值都是 200。

 

新浪微博(不允许缓存)的抓包图:

 

posted @ 2015-07-19 12:50  nemo20  阅读(314)  评论(0编辑  收藏  举报
访客数:AmazingCounters.com
2016/05/17 起统计