Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cache - 浏览器缓存策略 #7

Open
yizihan opened this issue Feb 22, 2018 · 0 comments
Open

Cache - 浏览器缓存策略 #7

yizihan opened this issue Feb 22, 2018 · 0 comments

Comments

@yizihan
Copy link
Owner

yizihan commented Feb 22, 2018

Cache-Control (强缓存)

存在于Response Headers中,指定所有缓存机制在整个请求/响应链中必须服从的指令。

  • max-age:缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高;并且优先级高于Expires。
    对应的Status Code:200(from memory cache)
  • no-cache:必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。
  • no-store:所有内容都不会被缓存到缓存或 Internet 临时文件中。

Expires (强缓存)

用来控制缓存的失效日期。

Last-Modefied (协商缓存)

在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是客户端请求的资源,同时有一个Last-Modified的属性标记此文件在服务器端最后被修改的时间。

客户端第二次请求此URL时,根据HTTP协议的规定,浏览器会向服务器传送If-Modified-Since报头,询问该时间之后文件是否有被修改过。

如果服务器端的资源没有变化,则自动返回 HTTP 304(Not Changed)状态码,内容为空,这样就节省了传输数据量。

Etag (协商缓存)

ETag是一个可以与Web资源关联的记号(token),用于标示URL对象是否改变。

当第一次访问某个URL资源时,服务器会产生一个Etag报头;当第二次请求此URL资源时,浏览器会想服务器传送If-None-Match,询问该文件是否发生了更改。

分级缓存策略

首先浏览器会检查资源的expires/cache-control,判断当前资源是否过期;然后检查资源的last-modified(if-modified-since)/etag(if-none-match),判断服务器上的资源是否发生更改,如果没有发生更改,则继续使用本地缓存的资源304;如果服务器资源发生了更改,则请求更改后的资源。

缓存流程图

缓存流程图

@yizihan yizihan changed the title 浏览器缓存 浏览器缓存策略 Mar 3, 2018
@yizihan yizihan changed the title 浏览器缓存策略 Cache - 浏览器缓存策略 Mar 10, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant