zoukankan      html  css  js  c++  java
  • HTTP 缓存浅析

    关键词

    Cache-Control

    Cache-Control 标头控制浏览器和其他中间缓存如何缓存各个响应以及缓存多久,常用指令如下:

    no-cache: 每次在使用缓存资源之前,都必须向服务器请求并验证。

    no-store: 不允许缓存任何服务器响应或客户端请求。

    public: 响应可以被任何对象缓存。

    private: 响应只能被单个用户缓存,不允许任何中间缓存(代理服务器、CDN等)对其进行缓存。

    max-age: 允许响应被缓存的最长时间(秒)。

    在接下来的60秒内重复请求资源将使用缓存数据,不会向服务器发送请求。

    Cache-Control: max-age=60
    

    max-stale: 缓存过期后,在指定的时间内(秒)客户端仍然接受该缓存。参考 max-age 与 max-stale 区别

    must-revalidate: 在缓存过期之后,再次请求资源必须向服务器验证旧资源的状态,即使被告知旧资源是可用的(比如 max-stale 告知过期缓存继续可用)。

    If-Modified-Since/Last-Modified

    服务器响应头中的 Last-Modified 标头纪录了资源在服务端最后被修改的时间,当客户端再请求该资源时会带上 If-Modified-Since 标头,提供之前的 Last-Modified 值供服务器校验,如果资源没有改动,则返回'304 Not Modified'。

    If-None-Match/ETag

    服务端在对资源请求进行响应时可以在响应头里带上 ETag 值,通常是文件的哈希值或某个其他指纹,客户端接收到 ETag 值之后将在后续的请求中通过 If-None-Match 请求标头提供 ETag 指纹,如果未发生变化,服务器将返回304状态码和一个空的 body。如果 Cache-Control 中设有 max-age,缓存将会重新计算 age。

    疑问

    1. Cache-Control: max-age=0 与 Cache-Control: no-cache 区别?

    Cache-Control: max-age=0 表示响应可以被重用的最长时间为0秒,下一次请求时应该去服务端请求新的资源,不过某些时候客户端也会愿意接受一个已经过期的资源,这时就不会向服务端发送请求。Cache-Control: no-cache 并不是不缓存响应,而是表示使用缓存的数据前,无论何时必须向服务器发送请求进行验证。

    基于这种分析可以推测 Cache-Control: max-age=0, must-revalidate 与 Cache-Control: no-cache 行为类似

    1. If-Modified-Since 与 If-None-Match 优先级?

    当 If-Modified-Since 和 If-None-Match 同时存在时,将会忽略 If-Modified-Since,相对于 If-Modified-Since,If-None-Match 有着更精准的判断条件。二者同时使用仅仅为了兼容不支持 If-None-Match 的旧环境。

    1. max-age 与 Expires 优先级?

    Cache-Control 标头是在 HTTP/1.1 规范中定义的,Cache-Control: max-age 会被优先解析。

    1. 客户端请求头 Cache-Control 作用?

    请求头中的 Cache-Control 可以影响中间代理的缓存策略,比如当请求带有 Cache-Control: no-cache 时,中间代理将向服务器重新发送验证信息,即使有未过期的缓存资源也不会直接返回给请求方。

    参考

  • 相关阅读:
    编程珠玑第二章阅读笔记
    第四周学习进度博客
    python的文件操作
    python通过pymysql实现数据库的增删改查
    python爬取疫情数据详解
    python基本知识点if、while、等等
    apache使用总结
    slf4j的总结
    log4j2使用总结
    安全测试总结
  • 原文地址:https://www.cnblogs.com/raojs/p/6805085.html
Copyright © 2011-2022 走看看