-
Notifications
You must be signed in to change notification settings - Fork 891
Open
Labels
头条companycompany挖财companycompany掌门一对一companycompany滴滴companycompany爱范儿companycompany网易companycompany网络&安全teach_tagteach_tag脉脉companycompany虎扑companycompany
Metadata
Metadata
Assignees
Labels
头条companycompany挖财companycompany掌门一对一companycompany滴滴companycompany爱范儿companycompany网易companycompany网络&安全teach_tagteach_tag脉脉companycompany虎扑companycompany
Projects
Milestone
Relationships
Development
Select code repository
Activity
Genzhen commentedon Jun 22, 2020
1)浏览器缓存策略
浏览器每次发起请求时,先在本地缓存中查找结果以及缓存标识,根据缓存标识来判断是否使用本地缓存。如果缓存有效,则使
用本地缓存;否则,则向服务器发起请求并携带缓存标识。根据是否需向服务器发起HTTP请求,将缓存过程划分为两个部分:
强制缓存和协商缓存,强缓优先于协商缓存。
通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存。
HTTP缓存都是从第二次请求开始的:
2)强缓存
如果同时存在则使用Cache-control。
3)强缓存-expires
该字段是服务器响应消息头字段,告诉浏览器在过期时间之前可以直接从浏览器缓存中存取数据。
Expires 是 HTTP 1.0 的字段,表示缓存到期时间,是一个绝对的时间 (当前时间+缓存时间)。在响应消息头中,设置这个字段之后,就可以告诉浏览器,在未过期之前不需要再次请求。
由于是绝对时间,用户可能会将客户端本地的时间进行修改,而导致浏览器判断缓存失效,重新请求该资源。此外,即使不考虑修改,时差或者误差等因素也可能造成客户端与服务端的时间不一致,致使缓存失效。
优势特点
劣势问题
4)强缓存-cache-control
已知Expires的缺点之后,在HTTP/1.1中,增加了一个字段Cache-control,该字段表示资源缓存的最大有效时间,在该时间内,客户端不需要向服务器发送请求。
这两者的区别就是前者是绝对时间,而后者是相对时间。下面列举一些
Cache-control
字段常用的值:(完整的列表可以查看MDN)max-age
:即最大有效时间。must-revalidate
:如果超过了max-age
的时间,浏览器必须向服务器发送请求,验证资源是否还有效。no-cache
:不使用强缓存,需要与服务器验证缓存是否新鲜。no-store
: 真正意义上的“不要缓存”。所有内容都不走缓存,包括强制和对比。public
:所有的内容都可以被缓存 (包括客户端和代理服务器, 如 CDN)private
:所有的内容只有客户端才可以缓存,代理服务器不能缓存。默认值。Cache-control 的优先级高于 Expires,为了兼容 HTTP/1.0 和 HTTP/1.1,实际项目中两个字段都可以设置。
该字段可以在请求头或者响应头设置,可组合使用多种指令:
过期时间设置为过去时间。
的时间长度。
优势特点
劣势问题
5)协商缓存
识,只要资源变化,Etag就会重新生成。
6)协商缓存-协商缓存-Last-Modified/If-Modified-since
Last-Modified
字段告知客户端,资源最后一次被修改的时间,例如Last-Modified: Mon, 10 Nov 2018 09:10:11 GMT
Last-Modified
的值写入到请求头的If-Modified-Since
字段If-Modified-Since
的值与Last-Modified
字段进行对比。如果相等,则表示未修改,响应 304;反之,则表示修改了,响应 200 状态码,并返回数据。7)协商缓存-Etag/If-None-match
Etag
和If-None-Match
Etag
存储的是文件的特殊标识(一般都是 hash 生成的),服务器存储着文件的Etag
字段。之后的流程和Last-Modified
一致,只是Last-Modified
字段和它所表示的更新时间改变成了Etag
字段和它所表示的文件 hash,把If-Modified-Since
变成了If-None-Match
。服务器同样进行比较,命中返回 304, 不命中返回新资源和 200。xiawnag commentedon Aug 14, 2020
Nice~
RabbDream commentedon Aug 24, 2020
cache-control的默认值不是private吗
Genzhen commentedon Aug 25, 2020
@RabbDream 已修改,感谢指正Thanks♪(・ω・)ノ
2 remaining items