精华内容
下载资源
问答
  • fastify-etag 一个插件,根据自动生成 HTTP ETag 并在需要时返回 304。 安装 npm i fastify-etag 例子 'use strict' const Fastify = require ( 'fastify' ) const Etag = require ( 'fastify-etag' ) const app =...
  • Koa异步ETag +/-异步版本的 。 :light_bulb: 该中间件是为 v2.xx设计的,并使用来实现ES5兼容性。 :wrench: 该中间件正在开发中。 反馈/公关受到欢迎和鼓励。 如果您想在这个项目上进行合作,请告诉我。 安装 $...
  • 缓存ETag标头,并通过If-None-Match标头将它们发送回服务器。 使用灵活的缓存配置来缓存响应数据。 支持$cacheFactory , sessionStorage和localStorage开箱即localStorage缓存。 轻松于其他第三方缓存服务。 ...
  • etag-stoppa:Firefox的极简扩展,可无条件删除ETag响应标头
  • Go的缓存控制中间件添加ETag头(内容的md5)和Cache-Control头
  • ETag

    2019-10-06 01:19:13
    ETag ETag_百度百科 ETag 求助编辑百科名片 HTTP协议规格说明定义ETag为“被请求变量的实体值”。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是...

    ETag_百度百科

        ETag

        求助编辑百科名片

        HTTP协议规格说明定义ETag为“被请求变量的实体值”。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式:ETag:"50b1c1d4f775c61:df3"客户端的查询更新格式是这样的:If-None-Match : W / "50b1c1d4f775c61:df3"如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。测试Etag主要在断点下载时比较有用。

        编辑本段Etag 是什么

          Etag 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等。具体内部含义是使服务器控制的,就像Cookie那样。

          HTTP协议规格说明定义ETag为“被请求变量的实体值” 。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端。
        编辑本段Etag的好处和特点

          1、有些URL是多语言的网页,相同的URL会返回不同的东东。还有不同的Session有不同的Cookie也就有不同的内容。这种情况下如果过 Proxy,Proxy就无法区分导致串门,只能简单的取消cache功能。Etag解决了这个问题,因为它能区分相同URL不同的对象。

          2、老的HTTP标准里有个Last-Modified+If-Modified-Since表明URL对象是否改变。Etag也具有这种功能,因为对象改变也造成Etag改变,并且它的控制更加准确。Etag有两种用法 If-Match/If-None-Match,就是如果服务器的对象和客户端的对象ID(不)匹配才执行。这里的If-Match/If-None- Match都能一次提交多个Etag。If-Match可以在Etag未改变时断线重传。If-None-Match可以刷新对象(在有新的Etag时返回)。

          3、Etag中有种Weak Tag,值为 W/"xxxxx"。他声明Tag是弱匹配的,只能做模糊匹配,在差异达到一定阀值时才起作用。

          4、Etag对于cache CGI页面很有用。特别是论坛,论坛有办法为每个帖子页面生成唯一的Etag,在帖子未改变时,查看话题属性比较Etag就能避免刷新帖子,减少CGI操作和网络传输。比如论坛中看帖就返回Etag,减少论坛负担。

          5、Etag在不同URL之间没有可比性,也就是不同URL相同Etag没有特别意义。
        编辑本段ETag如何帮助提升性能

          聪明的服务器开发者会把ETags和GET请求的“If-None-Match”头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生ETag,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。

          其过程如下:

          客户端请求一个页面(A)。 服务器返回页面A,并在给A加上一个ETag。 客户端展现该页面,并将页面连同ETag一起缓存。 客户再次请求页面A,并将上次请求时服务器返回的ETag一起传递给服务器。 服务器检查该ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304(未修改——Not Modified)和一个空的响应体。
        编辑本段作用

          Etag 主要为了解决 Last-Modified 无法解决的一些问题。

          1、一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;

          2、某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒)

          3、某些服务器不能精确的得到文件的最后修改时间;

          为此,HTTP/1.1 引入了 Etag(Entity Tags).Etag仅仅是一个和文件相关的标记,可以是一个版本标记,比如说v1.0.0或者说"2e681a-6-5d044840"这么一串看起来很神秘的编码。但是HTTP/1.1标准并没有规定Etag的内容是什么或者说要怎么实现,唯一规定的是Etag需要放在""内。
        编辑本段工作原理

          Etag由服务器端生成,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。常见的是使用If-None-Match.请求一个文件的流程可能如下:

          ====第一次请求===

          1.客户端发起 HTTP GET 请求一个文件;

          2.服务器处理请求,返回文件内容和一堆Header,当然包括Etag(例如"2e681a-6-5d044840")(假设服务器支持Etag生成和已经开启了Etag).状态码200

          ====第二次请求===

          1.客户端发起 HTTP GET 请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头的内容就是第一次请求时服务器返回的Etag:2e681a-6-5d044840

          2.服务器判断发送过来的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,这个留在下面讲。如果不是,进入第二种情况:

          强Etag根据配置文件中的配置来设置Etag值,默认的Apache的FileEtag设置为:

          FileEtag INode Mtime Size

          也就是根据这三个属性来生成Etag值,他们之间通过一些算法来实现,并输出成hex的格式,相邻属性之间用-分隔,比如:

          Etag"2e681a-6-5d044840"

          这里面的三个段,分别代表了INode,MTime,Size根据算法算出的值的Hex格式,(如果在这里看到了非Hex里面的字符(也就是0-f),那你可能看见神了:))

          当然,可以改变Apache的FileEtag设置,比如设置成FileEtagSize,那么得到的Etag可能为:

          Etag"6"

          总之,设置了几个段,Etag值就有几个段。(不要误以为Etag就是固定的3段式)

          说明

          这里说的都是Apache2.2里面的Etag实现,因为HTTP/1.1并没有规定Etag必须是什么样的实现或者格式,因此,也可以修改或者完全编写自己的算法得到Etag,比如"2e681a65d044840",客户端会记住并缓存下这个Etag(Windows里面保存在哪里,下次访问的时候直接拿这个值去和服务器生成的Etag对比。

          注意

          不管怎么样的算法,在服务器端都要进行计算,计算就有开销,会带来性能损失。因此为了榨干这一点点性能,不少网站完全把Etag禁用了(比如Yahoo!),这其实不符合HTTP/1.1的规定,因为HTTP/1.1总是鼓励服务器尽可能的开启Etag。

    posted on 2012-04-08 13:36  lexus 阅读( ...) 评论( ...) 编辑 收藏

    转载于:https://www.cnblogs.com/lexus/archive/2012/04/08/2437565.html

    展开全文
  • Etag和Expires 性能调优

    2020-09-30 18:29:20
    本文对页面中Etag和Expires标识处理,使得页面更加有效被Cache
  • 在 Blog 盛行的今天,一些 Web 应用需要解析大量的 RSS Feed ....这里的 Etag 引起了我的注意. 什么是 Etag ? 通过阅读 RFC 2616 ,得到了对 Etag 的一点印象: The ETag response-header field pr
  • HTTP中的ETag是什么意思,如何使用
  • 深入理解浏览器的缓存机制 这篇文章详细介绍了浏览器缓存相关的内容,本文阿宝哥将介绍如何利用 ETag 和 If-None-Match 来实现缓存控制。此外,阿宝哥还将介绍 HTTP 中的 ...

    深入理解浏览器的缓存机制 这篇文章详细介绍了浏览器缓存相关的内容,本文阿宝哥将介绍如何利用 ETag 和 If-None-Match 来实现缓存控制。此外,阿宝哥还将介绍 HTTP 中的 ETag 是如何生成的。不过在此之前,我们得先来简单介绍一下 ETag。

    一、ETag 简介

    1.1 ETag 是什么

    ETag(Entity Tag)是万维网协议 HTTP 的一部分。它是 HTTP 协议提供的若干机制中的一种 Web 缓存验证机制,并且允许客户端进行缓存协商。这使得缓存变得更加高效,而且节省带宽。如果资源的内容没有发生改变,Web 服务器就不需要发送一个完整的响应。

    1.2 ETag 的作用

    ETag 是一个不透明的标识符,由 Web 服务器根据 URL 上的资源的特定版本而指定。如果 URL 上的资源内容改变,一个新的不一样的 ETag 就会被生成。ETag 可以看成是资源的指纹,它们能够被快速地比较,以确定两个版本的资源是否相同

    需要注意的是 ETag 的比较只对同一个 URL 有意义 —— 不同 URL 上资源的 ETag 值可能相同也可能不同。

    1.3 ETag 的语法

    ETag: W/"<etag_value>"
    ETag: "<etag_value>"
    
    • W/(可选):'W/'(大小写敏感) 表示使用弱验证器。弱验证器很容易生成,但不利于比较。强验证器是比较的理想选择,但很难有效地生成。相同资源的两个弱 Etag 值可能语义等同,但不是每个字节都相同。

    • "<etag_value>":实体标签唯一地表示所请求的资源。它们是位于双引号之间的 ASCII 字符串(如 “2c-1799c10ab70” )。没有明确指定生成 ETag 值的方法。通常是使用内容的散列、最后修改时间戳的哈希值或简单地使用版本号。比如,MDN 使用 wiki 内容的十六进制数字的哈希值。

    1.4 ETag 的使用

    在大多数场景下,当一个 URL 被请求,Web 服务器会返回资源和其相应的 ETag 值,它会被放置在 HTTP 响应头的 ETag 字段中:

    HTTP/1.1 200 OK
    Content-Length: 44
    Cache-Control: max-age=10
    Content-Type: application/javascript; charset=utf-8
    ETag: W/"2c-1799c10ab70"
    

    然后,客户端可以决定是否缓存这个资源和它的 ETag。以后,如果客户端想再次请求相同的 URL,将会发送一个包含已保存的 ETagIf-None-Match 字段的请求。

    GET /index.js HTTP/1.1
    Host: localhost:3000
    Connection: keep-alive
    If-None-Match: W/"2c-1799c10ab70"
    

    客户端请求之后,服务器可能会比较客户端的 ETag 和当前版本资源的 ETag。如果 ETag 值匹配,这就意味着资源没有改变,服务器便会发送回一个极短的响应,包含 HTTP “304 未修改” 的状态。304 状态码告诉客户端,它的缓存版本是最新的,可以直接使用它。

    HTTP/1.1 304 Not Modified
    Cache-Control: max-age=10
    ETag: W/"2c-1799c10ab70"
    Connection: keep-alive
    

    二、ETag 实战

    2.1 创建 Koa 服务器

    了解完 ETag 相关知识后,阿宝哥将基于 koakoa-conditional-getkoa-etagkoa-static 这些库来介绍一下,在实际项目中如何利用 ETag 响应头和 If-None-Match 请求头实现资源的缓存控制。

    // server.js
    const Koa = require("koa");
    const path = require("path");
    const serve = require("koa-static");
    const etag = require("koa-etag");
    const conditional = require("koa-conditional-get");
    
    const app = new Koa();
    
    app.use(conditional()); // 使用条件请求中间件
    app.use(etag()); // 使用etag中间件
    app.use( // 使用静态资源中间件
      serve(path.join(__dirname, "/public"), {
        maxage: 10 * 1000, // 设置缓存存储的最大周期,单位为秒
      })
    );
    
    app.listen(3000, () => {
      console.log("app starting at port 3000");
    });
    

    在以上代码中,我们使用了 koa-static 中间件来处理静态资源,这些资源被保存在 public 目录下。在该目录下,阿宝哥创建了 index.htmlindex.js 两个资源文件,文件中的内容分别如下所示:

    2.1.1 public/index.html
    <!DOCTYPE html>
    <html lang="zh-cn">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>ETag 使用示例</title>
        <script src="/index.js"></script>
    </head>
    <body>
        <h3>ETag 使用示例</h3>
    </body>
    </html>
    
    2.1.2 public/index.js
    console.log("大家好,我是阿宝哥");
    

    在启动完服务器之后,我们打开 Chrome 开发者工具并切换到 Network 标签栏,然后在浏览器地址栏输入 http://localhost:3000/ 地址,接着多次访问该地址(地址栏多次回车)。下图是阿宝哥多次访问的结果:

    2.2 ETag 和 If-None-Match

    下面阿宝哥将以 index.js 为例,来分析上图中与之对应的 HTTP 报文。对于 index.html 文件,感兴趣的小伙伴可以自行分析一下。接下来我们先来分析首次请求 index.js 文件的报文:

    2.2.1 首次请求 — 请求报文
    GET /index.js HTTP/1.1
    Host: localhost:3000
    Connection: keep-alive
    Pragma: no-cache
    Cache-Control: no-cache
    ...
    
    2.2.2 首次请求 — 响应报文
    HTTP/1.1 200 OK
    Content-Length: 44
    Cache-Control: max-age=10
    ETag: W/"2c-1799c10ab70"
    ...
    

    在使用了 koa-static 和 koa-etag 中间件之后,index.js 文件首次请求的响应报文中会包含 Cache-ControlETag 的字段信息。

    Cache-Control 描述的是一个相对时间,在进行缓存命中的时候,都是利用客户端时间进行判断,所以相比较 ExpiresCache-Control 的缓存管理更有效,安全一些。


    2.2.3 10s内 — 请求报文
    GET /index.js HTTP/1.1
    Host: localhost:3000
    Connection: keep-alive
    Pragma: no-cache
    Cache-Control: no-cache
    ...
    
    2.2.4 10s内 — 响应信息(General)
    Request URL: http://localhost:3000/index.js
    Request Method: GET
    Status Code: 200 OK (from memory cache)
    Remote Address: [::1]:3000
    Referrer Policy: strict-origin-when-cross-origin
    
    2.2.5 10s内 — 响应信息(Response Headers)
    Cache-Control: max-age=10
    Connection: keep-alive
    Content-Length: 44
    ETag: W/"2c-1799c10ab70"
    

    由于我们设置了 index.js 资源文件的最大缓存时间为 10s,所以在 10s 内浏览器会直接从缓存中读取文件的内容。需要注意的是,此时的状态码为:Status Code: 200 OK (from memory cache)


    2.2.6 10s后 — 请求报文
    GET /index.js HTTP/1.1
    Host: localhost:3000
    Connection: keep-alive
    If-None-Match: W/"2c-1799c10ab70"
    Referer: http://localhost:3000/
    ...
    

    因为 10s 之后,缓存已经过期了,而且在 index.js 文件首次请求的响应报文中也返回了 ETag 字段。所以此时浏览器会发起 If-None-Match 条件请求。这类请求可以用来验证缓存的有效性,省去不必要的控制手段。

    2.2.7 10s后 — 响应报文
    HTTP/1.1 304 Not Modified
    Cache-Control: max-age=10
    ETag: W/"2c-1799c10ab70"
    Connection: keep-alive
    ...
    

    因为文件的内容未发生改变,所以 10s 后的响应报文的状态码为 304 Not Modified。此外,响应报文中也返回了 ETag 字段。看到这里,有一些小伙伴可能会有疑惑 —— ETag 到底是如何生成的?接下来,阿宝哥将带大家一起来揭开 koa-etag 中间件背后的秘密。

    三、如何生成 ETag

    在前面的示例中,我们使用了 koa-etag 中间件来实现资源的缓存控制。其实该中间件的实现并不复杂,具体如下所示:

    // https://github.com/koajs/etag/blob/master/index.js
    const calculate = require('etag');
    // 省略部分代码
    
    module.exports = function etag (options) {
      return async function etag (ctx, next) {
        await next()
        const entity = await getResponseEntity(ctx)
        setEtag(ctx, entity, options)
      }
    }
    

    由以上代码可知,在 koa-etag 中间件内部会先通过 getResponseEntity 函数来获取响应实体对象,然后再调用 setETag 函数来生成 ETag。而 setETag 函数的实现很简单,在 setETag 函数内部,会通过 etag 这个第三方库来生成 ETag。

    // https://github.com/koajs/etag/blob/master/index.js
    function setEtag (ctx, entity, options) {
      if (!entity) return
      ctx.response.etag = calculate(entity, options)
    }
    

    etag 这个库对外提供了一个 etag 函数来创建 ETag,该函数的签名如下:

    etag(entity, [options])
    
    • entity:用于生成 ETag 的实体,类型支持 Strings,Buffers 和 fs.Stats。除了 fs.Stats 对象之外,默认将生成 strong ETag。

    • options:配置对象,支持通过 options.weak 属性来配置生成 weak ETag。

    了解完 etag 函数的参数之后,我们来看一下该函数的具体实现:

    function etag (entity, options) {
      if (entity == null) {
        throw new TypeError('argument entity is required')
      }
    
      // 支持fs.Stats对象
      // isstats 函数的判断规则:当前对象是否包含ctime、mtime、ino和size这些属性
      var isStats = isstats(entity)
      var weak = options && typeof options.weak === 'boolean'
        ? options.weak
        : isStats
    
      // 参数校验
      if (!isStats && typeof entity !== 'string' && !Buffer.isBuffer(entity)) {
        throw new TypeError('argument entity must be string, Buffer, or fs.Stats')
      }
    
      // 生成ETag标签
      var tag = isStats
        ? stattag(entity) // 处理fs.Stats对象
        : entitytag(entity)
    
      return weak
        ? 'W/' + tag
        : tag
    }
    

    etag 函数内部会根据 entity 的类型,执行不同的生成逻辑。如果 entityfs.Stats 对象,则会调用 stattag 函数来创建 ETag。

    function stattag (stat) {
      // mtime:Modified Time,是在写入文件时随文件内容的更改而更改,是指文件内容最后一次被修改的时间。
      var mtime = stat.mtime.getTime().toString(16)
      var size = stat.size.toString(16)
    
      return '"' + size + '-' + mtime + '"'
    }
    

    而如果 entity 参数非 fs.Stats 对象,则会调用 entitytag 函数来生成 ETag。其中 entitytag 函数的具体实现如下:

    function entitytag (entity) {
      if (entity.length === 0) {
        return '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"'
      }
    
      // 计算实体对象的哈希值
      var hash = crypto
        .createHash('sha1')
        .update(entity, 'utf8')
        .digest('base64')
        .substring(0, 27)
    
      // 计算实体对象的长度
      var len = typeof entity === 'string'
        ? Buffer.byteLength(entity, 'utf8')
        : entity.length
    
      return '"' + len.toString(16) + '-' + hash + '"'
    }
    

    对于非 fs.Stats 对象来说,在 entitytag 函数内部会使用 sha1 消息摘要算法来生成 hash 值并以 base64 格式输出,而实际的生成的 hash 值会取前 27 个字符。此外,由以上代码可知,最终的 ETag 将由实体的长度和哈希值两部分组成。

    需要注意的是,生成 ETag 的算法并不是固定的, 通常是使用内容的散列、最后修改时间戳的哈希值或简单地使用版本号。

    四、ETag vs Last-Modified

    其实除了 ETag 字段之外,大多数情况下,响应头中还会包含 Last-Modified 字段。它们之间的区别如下:

    • 精确度上,Etag 要优于 Last-Modified。Last-Modified 的时间单位是秒,如果某个文件在 1 秒内被改变多次,那么它们的 Last-Modified 并没有体现出来修改,但是 Etag 每次都会改变,从而确保了精度;此外,如果是负载均衡的服务器,各个服务器生成的 Last-Modified 也有可能不一致。

    • 性能上,Etag 要逊于 Last-Modified,毕竟 Last-Modified 只需要记录时间,而 ETag 需要服务器通过消息摘要算法来计算出一个hash 值。

    • 优先级上,在资源新鲜度校验时,服务器会优先考虑 Etag。即如果条件请求的请求头同时携带 If-Modified-SinceIf-None-Match 字段,则会优先判断资源的 ETag 值是否发生变化。

    五、总结

    本文阿宝哥首先介绍了 ETag 的相关基础知识,然后以 Koa 为例详细介绍了 ETag 和 If-None-Match 是如何实现缓存控制的。此外,阿宝哥还分析了 koa-etag 中间件内部依赖的 etag 第三方库是如何为指定的实体生成 ETag 对象。最后,阿宝哥列举了 ETag 与 Last-Modified 之间的主要区别。

    如果你还想进一步了解浏览器的缓存机制,你可以阅读 深入理解浏览器的缓存机制 这篇文章。在后续的文章中,阿宝哥将介绍如何实现资源的新鲜度检测,感兴趣的小伙伴不要错过哟。

    六、参考资源

    展开全文
  • 提起向百度提交数据,大家基本都会想到sitemap,最近又推出的etag是什么东东?真的能有效果吗? sitemap是解决网站收录至关重要的途径之一,而通常sitemap的更新都不是很及时,并且体量都相对较大,此时也消耗了相应...
  • 我们经常会看到请求地址中状态存在304,如果客户端(浏览器)发送的是一个条件验证...在进行条件请求时,一般请求头会带上 If-Modified-Since、 If-None-Match,这两个值分别对应响应头 Last-Modified、 ETag 返回的值

    总结一下,最近项目开发遇到的。由于缓存框架设计时,缓存请求文件时只以发起请求的url 为key,导致在客户端发起url 相同,传参类型不同的请求时,交替请求会出现,带上一次请求返回的etag ,进行下次请求,服务器每次比对etag 都是上次的,所以每次请求都是200,导致缓存没有效果。

    HTTP状态码304

    我们经常会看到请求地址中状态存在304,如果客户端(浏览器)发送的是一个条件验证请求,则web服务器可能会返回304响应,这就表明了客户端中所请求资源的缓存仍然是有效的,也就是说该资源从上次缓存到现在没有被修改过,浏览器会自动识别并读取缓存中的文件来显示。

    在进行条件请求时,一般请求头会带上 If-Modified-Since、 If-None-Match,这两个值分别对应响应头 Last-Modified、 ETag 返回的值

    在这里插入图片描述
    服务器会读取到这两个请求头中的值,判断出客户端缓存的资源是否是最新的,如果是的话,服务器就会返回304 Not Modified响应,客户端收到304响应后,就会从缓存中读取对应的资源.

    另一种情况是,如果服务器认为客户端缓存的资源已经过期了,那么服务器就会返回200 OK响应,响应体就是该资源当前最新的内容.客户端收到200响应后,就会用新的资源覆盖掉旧的缓存资源.

    只有在客户端缓存了对应资源且该资源的响应头中包含了Last-Modified或ETag的情况下,才可能发送条件请求.如果这两个头都不存在,则必须无条件请求该资源,服务器也就必须返回完整的资源数据.

    判断是否缓存过期

    主要的方式有两种,这两种都是设定请求头中的某一个字段来实现的:1、Expires;2、Cache-Control。Cache-Control设置后优先级比Expires高,先说下通过Cache-Control来控制缓存。
    在这里插入图片描述
    Cache-Control:max-age =86400;如果在请求头中设定了

    那么在86400s内,如果再去请求这个文件的话,是不会发起请求的。因为还没有过期呢!唯一例外是如果这个文件是你在浏览器地址栏输入的地址来请求的(比如你请求http://www.runoob.com/wp-content/themes/runoob/assets/js/hl/prettify.css),当你刷新的时候就会让当前的这个文件所设定的过期时间失效,直接去请求服务器来看是返回个304还是返回新文件。一般这么请求的都是我们常说的入口文件(例如index.html),入口文件一刷新就会重新向服务器请求,但是入口文件里面所引入的文件如js,css等不会随着刷新而另过期时间失效。除非你单找出来那个引入链接,通过浏览器地址栏去查询它并刷新

    判断文件变动
    常用的方式为Etag(一般是文件的MD5值)和Last-Modified,思路上差不多,这里只介绍Last-Modified的用法。

    Last-Modified方式需要用到两个字段:Last-Modified 和 if-modified-since。
    先来看下这两个字段的形式:

    Last-Modified:

    Sat, 28 Oct 2017 06:01:34 GMT

    If-Modified-Since:

    Sat, 28 Oct 2017 06:01:34 GMT

    当第一次请求某一个文件的时候,就会传递回来一个Last-Modified 字段,其内容是这个文件的修改时间。当这个文件缓存过期,浏览器又向服务器请求这个文件的时候,会自动带一个请求头字段If-Modified-Since,其值是上一次传递过来的Last-Modified的值,拿这个值去和服务器中现在这个文件的最后修改时间做对比,如果相等,那么就不会重新拉取这个文件了,返回304让浏览器读过期缓存。如果不相等就重新拉取。

    ETag 是 Entity Tag(实体标签)的缩写

    在HTTP1.1协议中其实就是请求HEAD中的一个属性

    HTTP/1.1 200 OK
    Date: Mon, 23 May 2005 22:38:34 GMT
    Content-Type: text/html; charset=UTF-8
    Content-Encoding: UTF-8
    Content-Length: 138
    Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
    Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
    ETag: "3f80f-1b6-3e1cb03b"
    Accept-Ranges: bytes
    Connection: close
    

    ETag是HTTP1.1中才加入的一个属性,用来帮助服务器控制Web端的缓存验证。

    它的原理是这样的,当浏览器请求服务器的某项资源(A)时, 服务器根据A算出一个哈希值(3f80f-1b6-3e1cb03b)并通过 ETag 返回给浏览器,浏览器把"3f80f-1b6-3e1cb03b" 和 A 同时缓存在本地,当下次再次向服务器请求A时,会通过类似 If-None-Match: “3f80f-1b6-3e1cb03b” 的请求头把ETag发送给服务器,服务器再次计算A的哈希值并和浏览器返回的值做比较,如果发现A发生了变化就把A返回给浏览器(200),如果发现A没有变化就给浏览器返回一个304未修改。

    这样通过控制浏览器端的缓存,可以节省服务器的带宽,因为服务器不需要每次都把全量数据返回给客户端。

    通常情况下,ETag更类似于资源指纹(fingerprints),如果资源发生变化了就会生成一个新的指纹,这样可以快速的比较资源的变化。在服务器端实现中,很多情况下并不会用哈希来计算ETag,这会严重浪费服务器端资源,很多网站默认是禁用ETag的。有些情况下,可以把ETag退化,比如通过资源的版本或者修改时间来生成ETag。

    如果通过资源修改时间来生成ETag,那么效果和HTTP协议里面的另外一个控制属性(Last-Modified)就雷同了,使用 Last-Modified 的问题在于它的精度在秒(s)的级别,比较适合不太敏感的静态资源。

    如果你也热衷技术欢迎加群一起进步:230274309 。 一起分享,一起进步!少划水,多晒干货!!欢迎大家!!!(进群潜水者勿加)

    点击链接加入群聊【编程之美】:https://jq.qq.com/?_wv=1027&k=h75BfFCg

    或者扫码
    在这里插入图片描述

    展开全文
  • Laravel开发-laravel-etag

    2019-08-27 13:41:41
    Laravel开发-laravel-etag 支持etag头的laravel ratelimiter。
  • Laravel开发-laravel-etag-middleware 一种Laravel中间件,用于向HTTP请求添加etags以提高响应时间
  • Laravel开发-laravel-weak-etag-middleware 向HTTP响应头添加弱etags的Laravel中间件
  • 一、Apache ... 也就是根据这三个属性来生成Etag值,他们之间通过一些算法来实现,并输出成hex的格式,相邻属性之间用-分隔,比如:"2e681a-6-5d044840",这里面的三个段,分别代表了INode,MTi...

    一、Apache

     

    Apache根据配置文件中的配置来设置Etag值,默认的Apache的FileEtag设置为:
           FileEtagINode Mtime Size
           也就是根据这三个属性来生成Etag值,他们之间通过一些算法来实现,并输出成hex的格式,相邻属性之间用-分隔,比如:"2e681a-6-5d044840",这里面的三个段,分别代表了INode,MTime,Size根据算法算出的值的Hex格式,可以改变Apache的FileEtag设置,比如设置成FileEtagSize,那么得到的Etag可能为:"6",设置了几个段,Etag值就有几个段。

     详细配置:

    步骤1
           在要启用ETag的目录下增加.htaccess文件并在其中增加一行,如图:FileETagMTime Size

    展开全文
  • 笔记 Apache 2.4.4的一个版本,其中包含我们已提交的一些修复程序。 该vendor分支股票Apache源代码,与master包含我们修复。 这些补丁修复了以下错误: 建造 顶层包含一个基本的build-httpd脚本,该脚本在/usr/...
  • Nginx Etag学习

    千次阅读 2019-09-30 14:02:09
    Nginx Etag学习Nginx Etag什么是EtagLast-Modified / If-Modified-SinceEtag工作原理为什么要使用EtagEtag字符含义强Etag和弱EtagEtag丢失问题Etag配置Etag带来的问题 Nginx Etag 什么是Etag Etag其实是一个页面的...
  • 带有Spring的REST的ETag

    2020-05-10 09:35:39
    请记住,自上次检索以来已对其进行了更新,因此先前的ETag值将不再起作用-响应将包含新数据和新ETag,这些ETag可以再次存储以备后用: curl -H 'Accept: application/json' -H 'If-None-Match: 'f88dd058fe...
  • Plack :: Middleware :: ETag-自动添加ETag标头。 概要 use Plack::Builder; my $app = builder { enable " Plack::Middleware::ETag " , file_etag => [ qw/ inode mtime size / ]; sub {[ ' 200 ' , [ ' ...
  • Etag

    2018-07-06 12:47:13
    Etag 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等。具体内部含义是使服务器控制的,就像Cookie那样。性能聪明的服务器开发者会把ETags和GET请求的“If-None-Match”头一起使用,这样可...
  • Etags原理:Add an Expires header已经对浏览器缓存机制中的Cache-Control和Expires进行了配置,这一条评测的是另外两个:Last-Modified和ETag。简单的说,即使设置了文件的期限,浏览器在访问资源时也会因为Last-...
  • ETag-Session use etag to realize the mechanism of session 项目采用koa作为web框架 采用Bigpipe实现客户端对服务端事件的订阅 此处只是简单的将数据存储在内存中,并且在多服务集群下未做同步,因为此处的目的是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,375
精华内容 19,350
关键字:

etag