• 院长。
    2019-07-17
    老师您好,我想请问一下,为什么有的地方说cache-control默认是private(比如cache-control的百度百科),有的地方说默认是public(比如您这篇文章),是百度百科的是错误的吗?还是根据场景不同所以默认不同吗?

    作者回复: 我看了一下rfc,对于private和public没有明确的默认值说法,可能是我弄错了,需要再测试看看。

    
     8
  • 龙宝宝
    2019-07-29
    max-stale相当于延长了过期时间,min-fresh相当于缩短了过期时间,可以这样理解吗

    作者回复: 可以这么理解,也是一个很好的角度。

    
     7
  • 闫飞
    2019-07-18
    min-fresh的含义是距离过期时间必须不短于约定的时间,保证取到的是短期内不会过时的内容。

    但是这里有个风险是,万一服务器端因为某些原因重新刷新了资源(服务迁移等),那么怎么反向通知缓存服务器去清理资源呢?尤其是已经返回给客户端的之前标记为fresh的资源?

    作者回复: http协议里没有对此做出规定,一般的做法是由源站向代理发送pull请求,要求代理主动更新缓存。

    这个pull请求不属于http协议,具体实现就看两者之间的约定了。

    
     3
  • 何用
    2019-07-17
    老师,CDN 服务是不是就是缓存代理的一种应用?还有文中图片的 X-Accel 是什么意思呢?

    作者回复: 1,是的。

    2. X-Accel是自定义字段,和x-powered-by差不多,意思是被谁加速。

    
     2
  • Geek_steven_wang
    2019-08-23
    如果cache-control中没有 no-store no-cache must-revalidate这时浏览器会怎么处理?

    Max-stale min-fresh 那个优先级高,如果两个都有,那个生效?

    作者回复:
    1.没有这些就按普通的缓存策略来处理,在有效期内直接用,过期发条件请求。

    2.这两个属性本身就是冲突的,如果同时给出,那就由服务器自己决定策略了,rfc本身没有对此做出规定。

    
     1
  • 徐海浪
    2019-07-17
    我们的做法是源服务器跟代理服务器联动,源服务器有文件变化(版本发布),触发更新代理服务器缓存。如果没有联动的机制,简单粗暴根据应用升级周期设置过期时间也可以,但这样会多做无用功。

    作者回复: 欢迎经验分享!

     1
     1
  • Geek_54edc1
    2019-07-17
    max-stale和min-fresh还是不太明白~~

    作者回复: max-stale是可以接受的过期时间,min-fresh是可以接受的新鲜时间。

    不好理解也没事,这两个属性用的不多,可以以后实际遇到了再体会。

    
     1
  • 居培波
    2019-07-17
    老师能结合nginx讲下缓存及代理吗?还是后面探索篇有讲。

    作者回复: 只要理解的http的缓存代理,nginx的是比较容易掌握的,可以结合nginx的文档,看proxy相关的指令,逐条对照http的功能。

    单纯讲nginx就有点太大了,讲不过来。

    
     1
  • 神三元
    2020-01-15
    深入浅出,讲的非常棒!

    作者回复: many thanks。

    
    
  • Flourishing
    2019-12-10
    1. 老师,我看那个完整的服务器端缓存控制策略图,在图上no-cache和must-revalidate两个一般只能存在一个吧?不能同时传递。
    2. 还有:“比较常用的一种做法是使用自定义请求方法“PURGE””,意思是自己在代码里面写个方法处理缓存的数据,对吧?

    作者回复:
    1.是的。

    2.没错,http允许自定义请求方法和处理逻辑。

    
    
  • Geek_49a9e9
    2019-08-30
    为啥我测试不出老师/22-1的那个response返回呢,我把www.chrono.com 换为我自己的域名 在/etc/host配置了,nginx也换了,没有返回X-Access等

    作者回复: 这个测试不需要做特别的修改,直接使用实验环境的配置就行。

    你可以用wireshark抓包看看,是否走的本地网络环境。

    
    
  • Geek_steven_wang
    2019-08-23
    服务器会根据客户端请求改变header值吗?客户端请求中要求must-revalidate 服务器之前策略是no-cache 这时服务器收到请求,response中是no-cache 还是must-revalidate?

    作者回复: must-revalidate是响应头里的属性,不会出现在请求头里,所以应该还是no-cache。

     1
    
  • Geek_steven_wang
    2019-08-22
    1. 文中第一张图服务器缓存控制,其实是服务器根据缓存策略向response中插入各header的过程,缓存服务器,浏览器根据header处理缓存。

    2. 文中客户端缓存过程中,是浏览器根据自己的缓存策略,向服务器发请求时,设置各header。但这些策略浏览器怎么知道呢?是用户通过浏览器设置界面设置吗?还是ajax请求时设置?如果不是前后端分类的应用,怎么设置这些header?

    3. 既然服务器端有自己的缓存策略,那客户端请求上来时,服务器会根据客户端请求header调整策略吗?如果会,是应用服务器自己处理,还是程序员代码预先写好处理逻辑?

    4. 什么情况下客户端会有only-if-cached
    展开

    作者回复:
    1.正确。

    2.http客户端有很多种,浏览器只是其中之一,如果用Python、php自己写客户端,那就可以使用这些缓存策略。
    浏览器通常有一些最基本的策略,而ajax等就可以自己灵活设置。

    3.服务器控制资源和缓存,它会检查请求资源的有效期,与客户端的请求比对,返回304或者是新的内容,应用服务器和应用服务器都可以设置。

    4.only-if-cached这个我也没有见过具体的应用场景,但既然有这个属性,就应该是有用的。

     1
    
  • 笨笨
    2019-08-17
    还有这个例子【排骨上贴着标签“max-age=30, proxy-revalidate, no-transform”。因为缓存默认是 public 的,那么它在便利店和顾客的冰箱里就都可以存 30 天,过期后便利店必须去超市进新货,而且不能擅自把“大排”改成“小排”。】
    
    
  • 笨笨
    2019-08-17
    所以缓存协商一定是采取最小值是么?比如第一次请求一个资源,客户端请求头里max_age是
    3000ms,而服务端给的响应头的max_age是5000ms,那最终在4000ms之后,客户端再请求此资源,就还是会发送请求对么?(因为超过了最小值3000ms),如果此时第二次请求又是个基于时间的条件请求,那么这第二次请求是接收到304么?

    作者回复:
    1.max-age不能用在请求头里,只能在响应头里指定资源的有效期。

    2.在有效期内,如果不是刷新,就可以直接使用缓存。

    3.发送条件请求,如果在有效期内,就会收到304。

    
    
  • 一坛幽梦
    2019-08-17
    听老师的课程真是查缺补漏呀,之前一直迷迷糊糊的东西,全搞清楚了,太感谢老师了

    作者回复: thanks。

    
    
  • J.D.
    2019-08-12
    有一些细节上的想问下,就是文中在 max-age、no-store、no-cache这几个里有时不是用“-”,而是用了“_”。

    作者回复: 感谢指正,不小心写错了,应该都是“-”,我尽快改过来。

    
    
  •        鸟人
    2019-07-29
    请问时间换空间是什么呢?

    作者回复: 比如数据压缩,就是时间换空间,增加了计算时间,减少了数据量。

    
    
  • Leon📷
    2019-07-21
    proxy-revalidtae 指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。是不是指由代理向源服务器验证缓存有效性,而不需要客户端亲自回源,不管怎么验证,都是要去源服务器的吧

    作者回复: 准确地说,proxy-revalidtae与must-revalidate的效果是相同的,但它只应用于public缓存。

     1
    
  • 一步
    2019-07-17
    老师请教一个有关302的问题,就是再前端代码中有个post请求,去请求后端服务器,当后端服务器处理完业务逻辑后,需要重定向到另一个网站,返回的是一个302的状态码和响应头Location是另一个网站地址。这时候问题出现了,当返回到前端的时候,浏览器没有自动跳转重定向后的地址,而是当作接口去请求了需要跳转后的地址,然后就出现了跨域的问题
    这个是什么原因呢?

    作者回复: 可以参考一下第18讲,改用303 see other。

    
    
我们在线,来聊聊吧