学习笔记拾遗 (一)http 缓存字段

时间:2023-01-12 23:43:40

学习笔记拾遗 (一)http 缓存字段

前言:

上了大学,学习编程也有两年多了,以前没有养成良好的笔记记录习惯,现在翻看以前的学习笔记,简直看不下去。再加上最近在培养自己写博客的习惯,所以决定重新学习了以前记录的知识点,并且把学习结果写成博客记录下来。

写之前,主要学习了这个文档:

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ

以及一些其他网上博客,它们都讲得已经十分详细,所以我就把自己的学习理解当作笔记写下来。

 

http 1.1 关于缓存的字段主要是 :

Cache-control ExpiresEtagIf-none-matchLast-modifiedIf-modified-since

 

Cache-control几个常见的取值含义:

1.no-cache:

 请求:告知(中间代理)服务器不直接使用缓存,要向原服务器发起请求

 响应:无论缓存是否过期,使用缓存前,将上次缓存的响应中与缓存相关的字段添加到请求中发送给服务端,服务端验证请求中所描述的缓存是否过期,如未过期,返回304

2.no-store:

    响应:直接禁止使用缓存,浏览器后退前进到该页面都要直接请求服务器。

3.private:

 响应:禁止中间缓存,如CDN缓存。只能用于浏览器缓存。

4.public: 

 允许中间缓存

5.must-revalidate: 

 过期前,可以使用缓存。一旦过期,必须重新验证。

6.Max-age:

    请求:告知(中间代理)服务器希望接收一个小于某个秒数内被更新过的资源。

 响应:设置一个整数代表缓存的有效秒数。这个时间是以date字段的时间计算的。

 

 

Expires:

设置一个日期,响应在此日期之后,即过期。还可以设置为无效日期,比如0-1,表示资源过期。另外Cache-control的优先级大于expires,设置了cache-controlexpires将会被忽略。

 

Last-modifiedIf-modified-since

Last-modified表示文件的最后修改时间,仅精确到秒。在缓存检验时,如果上次响应中带有此字段,则浏览器会向请求中添加if-modified-since这个检验字段,值为last-modified的值。与If-none-match一起出现时,会被忽略。如果匹配,则返回304未修改状态,否则返回新的资源。

 

Etagif-none-match:

Etag是文件一个标识符,一旦文件被修改,它就发生变化。它解决Last-modified无法判断在小于1秒内发生修改的文件。在缓存检验中,如果上次响应中带有此字段,则浏览器会向请求中添加if-none-match这个检验字段,值为If-none-match的值。如果匹配,则返回304未修改状态,否则返回新的资源。

 

一些浏览器缓存笔记:

1. 浏览器缓存只对GET请求有效,POST无效。

2. 浏览器前进后退在设置了cache-control: no-cache, must-revalidate仍然直接取缓存,不向服务器确认。只有设置了no-store,访问历史记录会强制刷新。

3. 301404页面也会缓存。

4. 缓存有效时间:设置了max-age=N,有效期就是N。没有这个属性就检查expires,比较expiresdate属性的值。如果没有expires,则检查last-modifed,此时缓存有效期等于(date-last-modified)/10

5. 据我测试,火狐和谷歌浏览器有些行为不一样。我设置了max-age为一个非常大的数,地址栏中回车,谷歌返回的是304,而火狐是直接取缓存的。

6. htmlmeta字段设置的缓存字段,是不可靠的,浏览器还是会根据自身的策略去判断。但是响应中的设置是绝对有效的。

7. 长期不变的资源应该避免304

 

关于缓存的细节和知识很多,上面哪里说得不对,请大家提出。