zoukankan      html  css  js  c++  java
  • HTTP缓存字段总结

    首部

    • 通用首部:有些首部提供了与报文相关的最基本的信息,它们被称为通用首部。
    • 请求首部:请求首部是只在请求报文中有意义的首部。
    • 响应首部
    • 实体首部: 用来描述HTTP报文的负荷,由于请求和响应报文中都可能包含实
      体部分,所以在这两种类型的报文中都可能出现这些首部。实体首部提供了有关实体及其内容的大量信息,从有关对象类型的信息,到能够对 资源使用的各种有效的请求方法。总之,实体首部可以告知报文的接收者它在对什 么进行处理。

    与缓存相关的HTTP首部字段

    1:通用首部字段里:

    2:请求首部字段里:

    3:实体首部:

    此处才开始正文~


    Pragma和Expires来规范。虽然这两个字段早可抛弃,但为了做http协议的向下兼容,你还是可以看到很多网站依旧会带上这两个字段。

    所以这里不再介绍过时的东东啦,大家简单了解这是关于缓存的就可以啦。

    Cache-Control

    这是个通用首部字段, 其有很多值可以设置:

    • no-store:禁止缓存对响应进行复制
    • no-cache: 可以存储在本地缓存区,但是在与原始服务器验证新鲜度之前不能给客户端使用。
    • max-age:表示的是从服务器将文档传来之时起,可以认为此 文档处于新鲜状态的秒数

    剩下的都是缓存校验字段。

    这些字段都是根据修改时间来判断文件是否有变动:

    • Last-Modified
    • If-Modified-Since: Last-Modified-value
    • If-Unmodified-Since: Last-Modified-value

    只根据修改时间来判断会有问题:如果在服务器上,一个资源被修改了,但其实际内容根本没发生改变,会因为Last-Modified时间匹配不上而返回了整个实体给客户端(即使客户端缓存里有个一模一样的资源)

    为了解决这个问题,推出了Etag实体首部字段。服务器会通过某种算法,给资源计算得出一个唯一标志符(比如md5标志),在把资源响应给客户端的时候,会在实体首部加上“ETag: 唯一标识符”一起返回给客户端。比如:Etag: "5d8c72a5edda8d6a:3239"

    如果服务器发现ETag匹配不上,那么直接以常规GET 200回包形式将新的资源(当然也包括了新的ETag)发给客户端;如果ETag是一致的,则直接返回304知会客户端直接使用本地缓存即可。

    那么客户端是如何把标记在资源上的 ETag 传回给服务器的呢?请求报文中有两个首部字段可以带上 ETag 值:

    • If-None-Match: ETag-value
    • If-Match: ETag-value

    需要注意的是,如果资源是走分布式服务器(比如CDN)存储的情况,需要这些服务器上计算ETag唯一值的算法保持一致,才不会导致明明同一个文件,在服务器A和服务器B上生成的ETag却不一样。

    附上参考链接:点击跳转,以及《HTTP权威指南》

  • 相关阅读:
    Django Ajax知识
    Django走过的坑
    Django-8 聚合查询与分组查询
    Django-7 ORM多表操作
    Django-6 Django ORM层
    Django-5 模板层
    docker 常用批量操作
    K8S 从私有仓库拉取镜像
    linux制作iso文件
    二进制安装docker
  • 原文地址:https://www.cnblogs.com/yadiblogs/p/10906719.html
Copyright © 2011-2022 走看看