《学习笔记拾遗 (一)http 缓存字段 》
前言:
上了大学,学习编程也有两年多了,以前没有养成良好的笔记记录习惯,现在翻看以前的学习笔记,简直看不下去。再加上最近在培养自己写博客的习惯,所以决定重新学习了以前记录的知识点,并且把学习结果写成博客记录下来。
写之前,主要学习了这个文档:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ。
以及一些其他网上博客,它们都讲得已经十分详细,所以我就把自己的学习理解当作笔记写下来。
http 1.1 关于缓存的字段主要是 :
Cache-control 、Expires、Etag、If-none-match、Last-modified、If-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-control,expires将会被忽略。
Last-modified、If-modified-since:
Last-modified表示文件的最后修改时间,仅精确到秒。在缓存检验时,如果上次响应中带有此字段,则浏览器会向请求中添加if-modified-since这个检验字段,值为last-modified的值。与If-none-match一起出现时,会被忽略。如果匹配,则返回304未修改状态,否则返回新的资源。
Etag、if-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. 301,404页面也会缓存。
4. 缓存有效时间:设置了max-age=N,有效期就是N。没有这个属性就检查expires,比较expires和date属性的值。如果没有expires,则检查last-modifed,此时缓存有效期等于(date-last-modified)/10。
5. 据我测试,火狐和谷歌浏览器有些行为不一样。我设置了max-age为一个非常大的数,地址栏中回车,谷歌返回的是304,而火狐是直接取缓存的。
6. 在html中meta字段设置的缓存字段,是不可靠的,浏览器还是会根据自身的策略去判断。但是响应中的设置是绝对有效的。
7. 长期不变的资源应该避免304。
关于缓存的细节和知识很多,上面哪里说得不对,请大家提出。