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

例如:

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

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

HTTP 笔记与总结(7)HTTP 缓存(配合 Apache 服务器)的更多相关文章

  1. Apache服务器代理与缓存

    Apache服务器代理与缓存 1.代理  正向代理:             反向代理:   mod_proxy模块 apache实现代理和网关的关键模块.加载mod_proxy模块:LoadModu ...

  2. js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)

    js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...

  3. Python之路第一课Day10--随堂笔记(异步IO\数据库\队列\缓存)

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

  4. [内核笔记1]内核文件结构与缓存——inode和对应描述

    由来:公司内部外网记录日志的方式现在都是通过Nginx模块收到数据发送到系统消息队列,然后由另外一个进程来从消息队列读取然后写回磁盘这样的操作,尽量的减少Nginx的阻塞. 但是由于System/V消 ...

  5. 学习笔记:同程旅游缓存系统设计:如何打造Redis时代的完美体系(含PPT)

    内容在:http://chuansong.me/n/478502951177 PPT在:http://pan.baidu.com/s/1nvnOEBf 工具 跟 服务 的差别 从工具到服务之间缺失了哪 ...

  6. 【代码笔记】iOS-清除图片缓存UIActionSheet

    一,效果图. 二,代码. RootViewController.m //点击任何处出现sheet -(void)touchesBegan:(NSSet *)touches withEvent:(UIE ...

  7. 安卓开发笔记——关于图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)

    在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价——流量.对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理 ...

  8. Silverlight项目笔记3:Silverlight RIA Services缓存引发的问题

     问题描述:使用Silverlight的RIA Services进行数据库更新操作,重复提交时发现异常,SubmitOperation发生错误,提示实体类冲突,检查发现之前删除的数据竟然还存在(数据库 ...

  9. HIbernate学习笔记(八) hibernate缓存机制

    hibernate缓存 一. Session级缓存(一级缓存) 一级缓存很短和session的生命周期一致,因此也叫session级缓存或事务级缓存 hibernate一级缓存 那些方法支持一级缓存: ...

随机推荐

  1. vector容器+iterator迭代器

    关于vector容器的详细描述,可参考:http://www.jb51.net/article/41648.htm   关于iterator迭代器的描述,可参考http://www.cppblog.c ...

  2. js “+” 连接字符串&数字相加 数字相加出现多位小数 函数调用单引号双引号嵌套和转义字符的使用

    一.机制 JavaScript中,加号不仅表示相加还表示字符串连接 当加号两边存在字符串时,加号代表连接,实际上是将两侧都转为了字符串,如 "1" + 1 = "11&q ...

  3. JUC回顾之-CyclicBarrier底层实现和原理

    1.CyclicBarrier 字面意思是可循环(Cyclic)使用的屏障(Barrier).它要做的事情是让一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时候,屏障才会开门.所有被 ...

  4. linux tricks 之 roundup.

    转载:http://stackoverflow.com/questions/1010922/question-about-round-up-macro 以下内容转载自stackoverflow关于 r ...

  5. 亿条数据在PHP中实现Mysql数据库分表100张

    当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过程如下: 首先创建100张表: $i=0; while($i<=9 ...

  6. 64位环境中使用SQL查询excel的方式解决

    --64位环境中使用SQL查询excel的方式 环境: OS:Windows Server 2008 R2 Enterprise MSSQL:Microsoft SQL Server 2008 R2 ...

  7. SQL_Server_2005_函数大全(描述及实例)

    为了方便阅读,把函数分为四种类型,分别表述. SQL_Server_2005_字符串函数(描述及实例) 函数名称:ascii.char.charindex.difference.left.right. ...

  8. 个人电脑配置FTP服务器,四张图搞定。项目需要,并自己写了个客户端实现下载和上传的功能!

    测试结果:

  9. JAVA定时执行任务的三种方法

    1.利用 java.util.Timer 这个方法应该是最常用的,不过这个方法需要手工启动你的任务 Timer timer=new Timer(); timer.schedule(new ListBy ...

  10. 阿里云DRDS:分布式数据库服务

    最近在做阿里云相关的项目,用到阿里的很多接口服务的API,于是想把这段项目做个总结,顺便梳理下阿里云的云计算的相关知识点. DRDS:分布式数据库服务. 1.相关术语 DRDS(Distribute  ...