http响应头中缓存相关字段

http响应头中缓存相关字段

浏览网页打开F12打开调试器,可以查看请求的详细情况(有些字段是没有的)。

强缓存:Expires,Cache-control

强缓存定义: 在缓存未失效时候,浏览器向服务端发起请求,直接从缓存中获取数据,
Expires 是http1.0的东西。
Cache-control 是http1.1的东西。cache-control:max-age=取代了expires。不过向下兼容expires。

expires

Expires的值为web服务器返回的到期时间(GMT 格林威治时间),浏览器下次请求时间小于服务器返回的时间则浏览器直接从缓存中获取数据,而不用再次发送请求。

cache-control

cache-control常见的取值:private, public, nocache, max-age, nostore
private : 客户端可以缓存
public : 客户端和代理服务器都可缓存
max-age= : 缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)
no-cache : 并不是不缓存,是会被缓存的,只不过每次在向浏览器提供相应数据时,浏览器每次都要向服务器发送请求,有服务器来决策评估缓存的有效性。
no-store : 所有内容都不缓存。

对比缓存(协商缓存,弱缓存): Last-Modified,Etag

Last-Modified

或者if-Modified-Since
服务器响应浏览器请求,告诉浏览器资源的最后修改时间

Etag

ETag是实体标签(Entity Tag)的缩写, 根据实体内容生成的一段hash字符串(类似于MD5或者SHA1之后的结果),可以标识资源的状态。可以理解为一个资源的唯一标识符,只要文件发生变化Etag的值也变化。

Last-Modified 和Etag区别:

Last-Modified 和Etag都是标识文件是否修改的。而Etag比Last-Modified更加严谨。

  1. 一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了
  2. 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断
  3. 如需要对动态生成的内容做缓存,那就可以用etag来控制缓存了
    注意:如果同时有Last-Modified和Etag存在,在发送请求时,浏览器会一次性的将这两个值都发给服务器,没有优先级,服务器是都比较,还是只比较一个,不同的web服务器可能比较逻辑不一样吧。

对比缓存定义:服务器对比判断文件是否修改,告诉浏览器是否可以使用本地缓存。对比生效时,服务器返回给浏览器的http code 为304,服务器只返回http header信息,并无响应正文。浏览器收到304的返回,知道本地缓存并无修改,直接使用本地缓存。

更加深入的了解:http缓存

你可能感兴趣的:(计算机基础)