您的位置:首页 > 理论基础 > 计算机网络

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

2015-07-19 12:50 681 查看
在网络上,有一些缓存服务器,另外浏览器自身也有缓存功能。

例如:

<!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。

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: