• Fstar
    2019-07-13
    Cache 和 Cookie 的相同点是:都会保存到浏览器中,并可以设置过期时间。
    不同点:
    1. Cookie 会随请求报文发送到服务器,而 Cache 不会,但可能会携带 if-Modified-Since(保存资源的最后修改时间)和 If-None-Match(保存资源唯一标识) 字段来验证资源是否过期。
    2. Cookie 在浏览器可以通过脚本获取(如果 cookie 没有设置 HttpOnly),Cache 则无法在浏览器中获取(出于安全原因)。
    3. Cookie 通过响应报文的 Set-Cookie 字段获得,Cache 则是位于 body 中。
    4. 用途不同。Cookie 常用于身份识别,Cache 则是由浏览器管理,用于节省带宽和加快响应速度。
    5. Cookie 的 max-age 是从浏览器拿到响应报文时开始计算的,而 Cache 的 max-age 是从响应报文的生成时间(Date 头字段)开始计算。
    展开

    作者回复: 总结的非常好。

    第三点感觉有点问题,cache缓存的是完整的报文,不单单是body。

     2
     18
  • 院长。
    2019-07-15
    老师我有几个问题想问一下:
    1. F5刷新的时候,请求头加上"Cache-Control: max-age=0",您文章里说,服务器用一个最新生成的报文回应浏览器,那这时候响应返回的应该是"200 OK"吗?为什么我在极客网页版的这个页面刷新后,有个叫"106804"的资源返回的是"304",但是强制刷新是"200 ok",产生的效果好像不同呀。这里是不是应该换一种方式说?感觉强制刷新说的有些简单了。
    2. F5刷新发送的请求头是固定的吗?还是会根据浏览器不同而产生变化?
    3. 200(from memory cache)和200(from disk cache)是针对内存和硬盘的,他们出现的场景分别是什么呢?
    4. HTTP缓存有标准性的流程吗?比如说从我输入URL开始,到后续刷新或者强制刷新等?
    5.对于"must-revalidate"我有疑问,本身存储机制不就是如果不过期的话可以继续使用,过期的话去请求服务器吗?那这个属性还有什么意义呢?
    6. no-cache,no-store,max-age等属性可以共存吗?
    问题有点多,因为网上资料质量参差不齐,解释有些也不全相同,所以在这里咨询下老师,希望老师可以解答一下,或者有推荐的讲述HTTP缓存的文章也可以,谢谢老师
    展开

    作者回复: 1.强制刷新请求最新的资源,没有条件请求,所以不会有304,都是200。

    2.每个浏览器可能会有不同,但基本的字段是一样的。

    3.缓存的位置不一样,浏览器会分别存放到内存或者硬盘上,所以会显示来源不同。

    4.http只规定了缓存的用法,具体如何存放如何使用就是客户端自己灵活实现了,怎么方便怎么来。

    5.过期后去验证,如果服务器返回304,那么就可以继续重用缓存,而不用下载整个资源。

    6.可以看一下流程图,不是所以的属性都能共存的。当然如果你要是都写上也不是不可以,那浏览器就会“精神错乱”了。

    
     4
  • 一步
    2019-07-13
    对于第二个问题:发现强制刷新后请求头中 没有了 If-None-Match ,而且 Cache-Control: no-cache

    是这个原因吗?

    作者回复: 对,没有条件请求头,那么服务器就无法处理缓存,就只能返回最新的数据。

    
     4
  • Leon📷
    2019-07-21
    小贴士的nginx计算etag我贴下测试logngx_sprintf(etag->value.data, ""%xT-%xO"", r->headers_out.last_modified_time,
    r->headers_out.content_length_n)相信大家看到这里更清晰明了

    作者回复: great。

    
     3
  • Reco
    2019-07-12
    1. cookie是方便进行身份识,cache是为了减少网络请求。
    2. 强制刷新是因为请求头里的 If-Modified-Since 和 If-None-Match 会被清空所以会返回最新数据

    作者回复: 回答正确,之前是我弄错了。

    
     3
  • Marvin
    2019-08-04
    我有一个问题,就拿咱们极客时间的网页来说,会请求一个Id-00001.ts的文件,响应头中指示了cache-control: max-age= 7200, 要一个小时才过期,那么为什么每次刷新都是304, 像这种情况不应该直接200 cacahe from disk才对么?为什么明明没有过期还要去服务器协商呢?

    作者回复: 刷新时发的是条件请求,不是普通的请求,所以就必须返回304,告诉浏览器内容没有过期,可以继续用缓存。

    普通请求才会直接检查缓存,然后是200 cacahe from disk。

    
     2
  • 来自地狱的勇士
    2019-07-12
    老师,既然Etag的算法比较复杂,需要占用服务器资源,那么,实际上服务器会使用Etag吗?看到有的资料说服务器很少会用到Etag,这个说法正确吗?

    作者回复: Nginx和Apache都有etag,但算法不同,但都不会用特别消耗计算资源的算法。

    其他的web服务器就不太清楚了。

    
     2
  • 啦啦啦
    2019-07-12
    老师,nocache,每次使用前都需要去浏览器问一下有没有过期,这不也是一次请求吗?那不和没有缓存一个意思吗

    作者回复: 不一样,如果服务器返回304,是一个很小的报文,这样浏览器就可以直接重用缓存里的数据,可以节约传输带宽。

    nostore每次都会传输完整的报文,成本高。

    
     2
  • Flourishing
    2019-12-07
    老师,您这里这么说的:“no-cache:它的字面含义容易与 no-store 搞混,实际的意思并不是不允许缓存,而是可以缓存,但在使用之前必须要去服务器验证是否过期,是否有最新的版本”。
    这个no-cache在这里浏览器请示服务器,如果服务器确定资源没有过期,没有新的版本,那么浏览器就是用缓存的数据了?感觉浏览器只要加上这个,就会获得最新的数据,没有走缓存吧?

    作者回复: 会获得最新的数据,但如果数据不变就直接走缓存,服务器返回304,省去了再次传输数据的成本。

    
     1
  • Khirye
    2019-11-25
    Hi, 我对缓存控制策略这张流程图有一些疑惑,must-revalidate是指缓存过期之后,必须要向服务器验证缓存,这一步应该是在图中”缓存最多x秒“这个判断之前的吧?
    因为只有缓存超过了max-age的期限,才会进入”must-revalidate的判断“这一步吧?
    烦请解惑,谢谢!

    作者回复: 这张图是“服务器”的缓存策略,也就是说服务器应该如何设置资源的缓存参数,并不是客户端判断缓存的流程。

    只要不是no-store就必然会设置max-age,所以must-revalidate是max-age的一个附加条件。

    
     1
  • walle
    2019-11-15
    cache-control 中的 private 是如何识别的呢?是根据session吗还是什么方式开识别是私有缓存呢

    作者回复: 缓存策略取决于服务器,它认为这个缓存只能存放在客户端,不能存放在代理上,就设置private。

    与session无关。

    
     1
  • walle
    2019-11-11
    max-age是不是只对文件请求有效?为什么我看到的例子都是请求文件?

    作者回复: 是的,缓存当然是只对获取文件有效,从服务器上拿到文件然后放入本地缓存。

    
     1
  • Been
    2019-09-04
    老师有文章说浏览器会在js和图片等文件解析执行后直接存入内存缓存中, 而css文件则会存入硬盘文件中。为什么? 存入内存还是硬盘 是怎么触发 的

    作者回复: http标准没有规定必须要存储在内存或磁盘,如何存储都是由客户端(浏览器)自己决定的。

    我觉得这种说法不准确,其实缓存都会落盘存储,但有的可能会在内存里也放一份,加快访问速度。

    
     1
  • DENG永青
    2019-08-07
    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.
    展开

    作者回复: 写的非常详细,点赞。

    
     1
  • blackjuly
    2019-08-06
    请问老师,有看到您说的一个ETag解决的问题: 一个文件在一秒内改变多次,可以用ETag来解决文件修改无法被感知到的情况;这个有场景可以举例吗?因为总感觉修改这么频繁的东西应该就不需要缓存了吧

    作者回复: 实际的应用场景我也暂时没见到,但last-modified从运行机制上是存在这个问题的。

    举个不恰当的例子,比如说某个应用的log,开放http接口获取在web上展示,如果log更新频繁,那么就应该用etag。

    
     1
  • 信信
    2019-07-30
    Cache-Control只是用来决定是否需要验证,而条件参数才是真正决定怎样验证的。如果没有条件参数,就当验证失败处理,返回新数据。

    作者回复: cache-control是管理缓存,不是决定验证的。

    验证的条件是modified-date和etag,由条件请求发起验证。

    
     1
  • WL
    2019-07-12
    请问老师弱ETag是服务器更新时自己判断本次的更新有没有语义的变化,如果语义有变化就重新生成一个ETag,如果没有变化不重新生成直接使用原来的,请问是这样的流程吗?

    作者回复: 强etag和etag的流程都是一样的,只是计算的方式不同,(即判断是否发生变化的方式不同)。

    你的理解正确。

    
     1
  • 、落叶为你舞
    2020-02-07
    老师,服务器响应Cache-Control:no-cache,max-age=10,Etag=xxx,点击后退时,如果缓存已过期还会带上If-None-Match吗,如果没过期服务器返回后会重新设置max-age吗

    作者回复: 是的,发现有缓存,但过期就要发个条件请求,看缓存是否可用,再用max-age更新一下。

    
    
  • keep it simple
    2020-01-22
    请教老师两个问题:
    1.Date字段实际不等于文件离开服务器的时刻。比如早上7:00做实验,响应报文中的date却是昨天的23点。那max-age是以7:00为起点开始计算,还是昨天23:00开始计算呢?
    2.关于last-modified-since和if-none-match两个条件请求,是先验证时间,再验证ETag吗?以下四种情况,我的分析对吗?
    (1)    服务器上文件的date不变,Etag不变——回复304
    (2)    Date不变,etag变——浏览器重新获取,服务端回复200 ok
    (3)    Date变,etag不变——回复304
    (4)    Date变,etag变——浏览器重新获取,服务端回复200 ok
    展开

    作者回复:
    1.date就是报文离开服务器的时间,max-age依赖date字段。

    2.last-modified-since和if-none-match两个条件只要给出就会验证,有变化就会返回新的。

    
    
  • 神三元
    2020-01-15
    ETag生成的原理没有讲?

    作者回复: 每个服务器的etag生成算法不一样,可以参考小贴士。

    
    
我们在线,来聊聊吧