服务器如果是集群,不同服务器返回的 Http Header 中的 Etag 参数不一样。如果是图片是程序生成的,我们可以用 no-cache 这些 header 来控制,但如果这些图片是 apache 或 nginx 等呢?
下面开始介绍 Etag:

Etag在HTTP1.1中有介绍,主要的作用就是在(css file, image, javascript file)文件后面添加一个唯一的参数(相当于查询参数字符串),Etag有服务器端生成,并且随着文件的改变而改变,这样浏览器端就会只重新请求获取 Etag发生变化的文件,减少浏览器端数据的流量,加快浏览器的反应速度,重要的是减轻服务器端的压力,所以服务器端Etag的实现就比较重要了。

现在我们有个问题为什么要使用Etag呢?

Etag主要为了解决Last-Modified无法解决的一些问题.他能比Last_Modified更加精确的知道文件是否被修改过.如果有个文件修改非常频繁,比如在秒以下的时间内进行修改,比如1秒内修改了10次,If-Modified-Since能检查只能秒级的修改,所以这种修改无法判断.原因是UNIX记录MTIME只能精确到秒.所以我们选择生成Etag,因为Etag可以综合Inode,MTime和Size,可以避免这个问题.

Etag的工作原理
Etag在服务器上生成后,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。我们常见的是使用If-None-Match.请求一个文件的流程可能如下:
新的请求
客户端发起HTTP GET请求一个文件(css ,image,js);服务器处理请求,返回文件内容和一堆Header(包括Etag,例如"2e681a-6-5d044840"),http头状态码为为200.

同一个用户第二次这个文件的请求
客户端在一次发起HTTP GET请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头中会包括上次这个文件的Etag(例如"2e681a- 6-5d044840"),这时服务器判断发送过来的Etag和自己计算出来的Etag,因此If-None-Match为False,不返回200,返回304,客户端继续使用本地缓存;

注意.服务器又设置了Cache-Control:max-age和Expires时,会同时使用,也就是说在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,服务器才能返回304.

下面是在Apache中的Etag的配置

在Apache中设置Etag的支持比较简单,只需要在apache的配置中加入下面的内容就可以了:

FileETag MTime Size

注解:FileETag指令配置了当文档是基于一个文件时用以创建ETag(实体标签)应答头的文件的属性(ETag的值用于进行缓冲管理以节约网络带宽)。ETag的值由文件的inode(索引节点)、大小、最后修改时间决定。FileETag指令可以让您选择(如果您想进行选择)这其中哪些要素将被使用。主要关键字如下:

INode
文件的索引节点(inode)数
MTime
文件的最后修改日期及时间
Size
文件的字节数
All
所有存在的域,等价于:FileETag INode MTime Size
None
如果一个文档是基于文件的,则不在应答中包含任何ETag头

在大型多WEB集群时,使用ETag时有问题,所以有人建议使用WEB集群时不要使用ETag,其实很好解决, 因为多服务器时,INode不一样,所以不同的服务器生成的ETag不一样,所以用户有可能重复下载(这时ETag就会不准),明白了上面的原理和设置后,解决方法也很容易,让ETag后面二个参数,MTime和Size就好了.只要ETag的计算没有INode参与计算,就会很准了.

如果动态程序要生成ETAG 也很简单,如: $etag = ‘”‘ . md5($body) . ‘”‘;

HTTP头信息中的参数Etag相关推荐

  1. etag java_HTTP头信息中的参数Etag

    服务器如果是集群,不同服务器返回的HttpHeader中的Etag参数不一样.如果是图片是网络 服务器如果是集群,不同服务器返回的 Http Header 中的 Etag 参数不一样.如果是图片是程序 ...

  2. 获取头信息header中参数access_token失败,获取header头信息中带下划线参数失败

    今天获取header头信息中参数access_token返回为null,本地用postman测试没问题,发布到线上环境就出问题了.         后面发现是nginx代理的过程中参数被过滤了,ngi ...

  3. JAVA获取请求头header中的参数

    //获得当前HttpServletRequest对象protected HttpServletRequest getRequest(){return ((ServletRequestAttribute ...

  4. 从MP4头信息中提取sps和pps数据

    转自:https://blog.csdn.net/tracydawn123/article/details/31773153 一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC ...

  5. JWT 中头信息中的 Authorization 为啥要加 Bearer 开头,为什么要加 Bearer

    Bearer 代表 Authorization 头定义的 schema ,除了 Bearer,还有其它的一些 schemas , 标准规范请查看文档地址:HTTP authentication - H ...

  6. 在header中添加中文头信息

    默认情况下,在http头信息中不能存放中文,如果需要在header中添加中文头信息,需要进行编码处理. 发送方: String data = URLEncoder.encode("中文&qu ...

  7. 浏览器HTTP协议请求头信息

    通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息.客户端向服务器发送一个请求,请求头包含请求的方法.URI.协议版本.以及包含请求修饰符.客户信息和内容的类似于MIME的消息结构 ...

  8. openresty获取nginx请求头信息

    vi test.lua:在nginx.conf配置文件中已经指定了lua脚本了 获取到请求头信息可以帮助我们做什么呢? ①比如对同一请求url,实际上也可以认定为是同一请求用户,可以限定其单位时间内的 ...

  9. Feign传递请求头信息

    在我之前的文章服务网关Spring Cloud Zuul中,将用户的登录id放在了请求头中传递给内部服务.但是当内部服务之间存在feign调用时,那么请求头信息会在feign请求的时候传递吗?不会,请 ...

最新文章

  1. [ CodeForces 865 D ] Buy Low Sell High
  2. python变量定义类型_03_python的数据类型和变量的定义及使用
  3. 进入“0”和“1”的世界
  4. 将uglifyjs添加到鼠标右键菜单
  5. jmc线程转储_查找线程转储中的异常和错误
  6. MySQL数据库常用的操作命令(一)
  7. python模块arrow_Python Arrow模块
  8. 数组的循环及跌送方式
  9. es 模糊查询_【ES 系列5】ES 查询优化
  10. 16 Three.js 游戏操作案例
  11. 获取汉字的拼音码(工具类)
  12. PCIE配置空间设置
  13. 不想用win11了怎么办?一分钟教你win11退回到win10系统
  14. 豆瓣民谣排行100爬取练习
  15. 使用Opencv2+Pyqt5实现人脸识别视频马赛克
  16. 林轩田机器学习基石笔记5 - Training versus Testing
  17. 远程桌面访问计算机的步骤,如何开启远程桌面连接功能
  18. 计算机数字音乐分手,我的音乐史记之十四:那些关于分手的歌
  19. Debian GUN/Linux Desktop grap语言配置 [大三四八九月实习]
  20. 4G网络数据传输流程 三

热门文章

  1. linux sql server客户端,Linux的MS SQL Server客户端SQuirrel SQL Client
  2. 数据结构--单链表(数组)
  3. 基于FPGA系统合成两条视频流实现3D视频效果
  4. 数据结构与算法(6-2)二叉树的存储结构(顺序存储、链式存储)
  5. java string改变的影响_为什么Java的string类要设成immutable(不可变的)
  6. 兰州大学C语言程序设计课程作业,【兰州大学|兰州大学C语言程序设计课程作业( 五 )】语言程序设计|课程|作业-傻大方...
  7. cv_bridge中的编码模式与实现
  8. PCL深度图像(1)
  9. 将图片(路径)转换为Base64 和 将base64转换为file类型
  10. Blender写实产品创作学习教程