zoukankan      html  css  js  c++  java
  • http的一些事

    查找资料将http中缓存相关的知识记录下

    一般来说:Last-Modifed和Expires是一对,ETag和Cache-Control是一对

    Last-Modified

    1. Client端跟Server端要一个资源,Server回应HTTP 200 OK,并打下一个Last-Modified日期。
    2. 当客户端再次要求同一个资源时,会先去检查自己的Cache里面有没有相同的资料,有的话,会检查是不是过期了(Expires or Cache-Control)。
    3. 没有过期的话:取出自己的资源,停止对服务器发送请求,流程结束。
    4. 如果已经过期,或者是根本就找不到与过期有关的标签,那么就对服务器丟出If-Modified-Since标签,标头后面的日期当然是复制之前被服务器端指定的日期了。
    5. 服务器端收到If-Modified-Since的日期,就可以拿來判断是否要重新丟或者拒绝丟新的资源,如果拒绝丢的话,就拋出HTTP 304 Not Modified,如果重新丟的話,就丟吧。
    6. Client端如果收到HTTP 304,就会乖乖的把Cache拿出來继续用。

    ETag

    1. Client端跟Server端要一个资源,Server回应HTTP 200 OK,并打下一个ETag雜湊。(雜湊的產生方式由程式設計師自己制定,這邊沒有太多的規範。)
    2. 当客戶端再次要求同一个资源时,会先去检查自己的Cache里面有没有相同的资料,有的话,会检查是不是过期了(Expires or Cache-Control)。
    3. 沒有过期的话:取出自己的资源,停止对服务器发送请求,流程结束。
    4. 如果已经过期,或者是根本就找不到与过期有关的标签,那么就对服务器丟出If-None-Match标头,标头后面的编码当然是复制之前被服务器端指定的编码了。
    5. 伺服器端收到If-None-Match的雜湊,就可以拿來判斷是否要重新丟或者拒絕丟新的資源,如果拒绝丢的话,就拋出HTTP 304 Not Modified,如果重新丟的话,就丟吧。
    6. Client端如果收到HTTP 304,就会乖乖的把Cache拿出來继续用。

    由上面可以得知,Last-Modified、ETag这两种机制的运作模式几乎是一样的

    再论Expires与Cache-Control

    Expires是HTTP 1.0的产物,而Cache-Control是HTTP 1.1的产物,这两个都是在描述资源的过期时间点,但是为何要创造出两种的标头呢?原因在于Expires是从服务器端打下來的时间,这一点是比较有争议的,尤其当Client端的時間进行比较大的变动时(例如出国换时区、电脑的时间跳掉),整個快取得的机制就毀掉了。因此后来Cache-Control把机制改成计算制度(秒数),也就是说拿出Client端时间來相加此秒数,就等于是过期时间点。※注:事实上仔细一想,如果你的Client时间真的错误了,那么用Cache-Control依然无法解决问题。

    这边会再讨论出一个问题点,那就是ETag是以编码为基础的,在取得不到日期的情況下,如何拿来与Cache-Control的秒速来相加,并计算出过期时间呢?这一点我找了许多的文章,目前还没有一定的解释。我推测有可能是拿标头的Date或Last-Modifed來运算,也有可能浏览器自己制定了一个计时的功能,或者是拿本地端的档案存档时间来算,这都有可能。所以我的作法是怎就算你打出ETag,还是会再帮忙打出一次Last-Modifed來进行辅助,以利计算过期时间。因此Google這篇使用瀏覽器快取功能的文章中,有关于「同時指定Last-Modified和ETag,都是多余的行为。」這句话值得玩味

    此外值得一提的是,在现代的浏览器中,如果你设定了Cache-Control而没有设定Expires,則Cache-Control會盖过Expires的设定。另外也要注意的是,RFC2616规范,Cache的设定不可以超過一年。

    总结

    如果你把这篇文章从头看到尾,你就会发现使用Last-Modifed与Cache-Control這两个标头就好,其他都有如浮云般的无意义,这个再次的证明,革新不代表一定就是好事。当然,也不能说ETag就没有存在的意义,想想看,如果你的服务器群共用某一个资源(例如你公司的Logo),但是基于某些因素你没有办法让这些服务器群的时间同步,那么选用ETag的机制来对此图示进行编码,会是一个比较好的做法。

    补充

    若你只有使用Last-Modifed而没有使用Expires or Cache-Control的缺点是,在强制重新整理网页時,你看不出任何效果。但是当你在同一个URL下,直接在网址列上再按下一次ENTER,你就会发现,没有使用到Expires or Cache-Control的资源,会强制再去跟服务器要一次GET,只不過会得到304,而这个通讯根本是非必要的。

  • 相关阅读:
    消息中间件(一)MQ详解及四大MQ比较
    SIP协议
    PAT (Basic Level) Practice 1008 数组元素循环右移问题
    LeetCode-Algorithms 1. 两数之和
    PAT (Basic Level) Practice 1040 有几个PAT
    PAT (Basic Level) Practice 1023 组个最小数
    PAT (Basic Level) Practice 1021 个位数统计
    PAT (Basic Level) Practice 1007 素数对猜想
    PAT (Basic Level) Practice 1006 换个格式输出整数
    PAT (Basic Level) Practice 1004 成绩排名
  • 原文地址:https://www.cnblogs.com/mikeluwen/p/6228671.html
Copyright © 2011-2022 走看看