在“使用ETag跟踪用户”中有一点被忽略了,因为要用这张小图统计统计uv, 所以要求浏览器必须每次都要发送这个图片的请求。这需要服务器对图片的缓存策略做设置。

http/1.0 和 http/1.1 的缓存策略不同,浏览器缓存这事看似简单,实际上很容易模棱两可,造成疏忽。

HTTP/1.0

协议文档: https://www.w3.org/Protocols/HTTP/1.0/spec.html

相关字段:

  • Date: 服务器响应的时间
  • Expires: 资源过期时间
  • Last-Modified: 资源最后修改时间
  • If-Modified-Since: 用来验证资源是否过期

策略:

如果Expires设置的时间在Date之后,则浏览器在Expires标记的时间之前都不会访问服务器了,而是使用浏览器缓存,入下图:

如果Expires设置的时间在Date之前,或者浏览器时间已经在Expires之后,那么再次访问图片时, 浏览器就要向服务器发送请求,但不是重新拉取数据,而是询问服务器该资源是否过期,方法时,把上次response中Last-Modified的时间作为If-Modified-Since的时间,发送请求,服务器对比该时间和资源目前的更改时间,如果未更改,则返回304,否则传输新文件,如下:

HTTP/1.1

HTTP/1.0缓存机制完全依赖时间,弊端显而易见,服务器、客户端的时钟不同步,文档的 更新周期小于1s, 都会出现问题。

所以HTTP/1.1提倡的缓存机制是,对比文档的hash值,文档内容变,则hash变,用相对时间代替绝对时间

协议文档:https://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html

HTTP/1.1 继承 HTTP/1.0 所以HTTP/1.0的相关字段仍然有效,保留的这些字段就是为了兼容那些仅支持HTTP/1.0的客户端。 HTTP/1.1服务器不应该设置与1.0矛盾的过期策略, 1.1的服务器在没有文档hash值时,也可以使用If-Modified-Since进行判断文档过期。

新增字段:

Cache-Control最容易理解也是最常用的就是:

  • no-cache: 浏览器缓存,但是认为是过期缓存
  • no-store: 浏览器不缓存
  • max-age:缓存有效时间段

如果想要浏览器每次发送请求,还启用缓存,那就使用Cache-Control: no-cache, 每次访问图片,浏览器都会去验证Etag. 过程如下:

Nginx设置

最好的方法就是使用expires指令, 它兼顾1.1和1.0, 即所有的字段都会给设置。但是nginx不支持ETag, 需要自己实现。 如果expires -1, 就是我需要的,浏览器既缓存数据,但是每次访问都请求服务器。 详见: http://nginx.org/en/docs/http/ngx_http_headers_module.html

HTTP缓存 1.0 vs 1.1的更多相关文章

  1. iOS开发--基于AFNetWorking3.0的图片缓存分析

    图片在APP中占有重要的角色,对图片做好缓存是重要的一项工作.[TOC] 理论 不喜欢理论的可以直接跳到下面的Demo实践部分 缓存介绍 缓存按照保存位置可以分为两类:内存缓存.硬盘缓存(FMDB.C ...

  2. 【转载】基于AFNetWorking3.0的图片缓存分析

    原文出处: Yasin的简书 理论 不喜欢理论的可以直接跳到下面的Demo实践部分 缓存介绍 缓存按照保存位置可以分为两类:内存缓存.硬盘缓存(FMDB.CoreData…).我们常说的网络请求缓存包 ...

  3. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  4. .NET缓存框架CacheManager在混合式开发框架中的应用(1)-CacheManager的介绍和使用

    在我们开发的很多分布式项目里面(如基于WCF服务.Web API服务方式),由于数据提供涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发式增长,如果数据库服务器 ...

  5. hibernate缓存机制详细分析 复制代码 内部资料 请勿转载 谢谢合作

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

  6. 基于spring4.0配置分布式ehcache,以及相关使用

    说明:本文是基于RMI手动同步的方式,使用程序动态注入配置缓存,抛弃传统的ehcache.xml配置方式 1,注入cacheManager管理所有缓存,添加各个缓存名及相关参数配置: 思路大致是: 在 ...

  7. Hibernate的一级二级缓存机制配置与测试

    特别感谢http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session ...

  8. ThinkPHP 3.2.3 数据缓存与静态缓存

    ThinkPHP 3.2.3 中手册中数据缓存的地址是:http://www.kancloud.cn/manual/thinkphp/1835 静态缓存的地址是:http://www.kancloud ...

  9. 使用APC缓存PHP opcode

    1.  关于版本 我的php版本是5.3.10  最开始使用 APC-3.1.8  编译成功,但是 php -m 得不到扩展 , 换成 APC-3.1.9  后解决. 2.  关于配置 apc.cac ...

随机推荐

  1. <php>PDO用法一

    <?php //造PDO对象 $pdo = new PDO("mysql:dbname=mydb;host=localhost","root"," ...

  2. [Err] 1449 - The user specified as a definer ('admin_isbox'@'localhost') does not exist

    晚上加班调用一个远程拷贝的本地Mysql的储存过程,报错:[Err] 1449 - The user specified as a definer ('admin_isbox'@'localhost' ...

  3. [Javascript] lodash: memoize() to improve the profermence

    Link: https://lodash.com/docs#memoize Example: .service('UserPresenter', function(UserConstants){ va ...

  4. [华为机试练习题]55.最大公约数 &amp; 多个数的最大公约数

    题目 描写叙述: 输入2个数字,最后输出2个数字的最大公约数 题目类别: 位运算 难度: 0基础 执行时间限制: 无限制 内存限制: 无限制 阶段: 入职前练习 输入: 2个整数 输出: 输出数字1和 ...

  5. JavaScript学习笔记:检测数组方法

    检查数组的方法 很多时候我们需要对JavaScript中数据类型(Function.String.Number.Undefined.Boolean和Object)做判断.在JavaScript中提供了 ...

  6. 解决Android AVD启动报错问题

    好不容易从ADT Bundle转为Android Studio的开发环境,一路荆棘,现在又遇到了模拟器的问题,本来直接用真机调试程序会更快些,但是为了模拟多种系统不得不开启AVD. 废话不说,问题和解 ...

  7. ASP.Net MVC与WebForm的区别

  8. PL/SQL语句块提高1+case语句

    set serveroutput on; declare --默认值的bianliang v_a ; -- v_b integer; --用stud.id 的类型 v_id stud.id%type; ...

  9. silverlight visifire控件图表制作——silverlight 静态页面xaml

    一.silverlight 静态页面 1. 时间控件:DatePicker ,添加引用: xmlns:sdk="clr-namespace:System.Windows.Controls;a ...

  10. hdu Red and Black

    算法:深搜 题意:就是让你找到一共可以移动多少次,每次只能移到黑色格子上, Problem Description There is a rectangular room, covered with ...