当我访问chesseng.herokuapp.com我得到一个响应头,看起来像
Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/css
Date:Tue, 16 Oct 2012 06:37:53 GMT
Last-Modified:Tue, 16 Oct 2012 03:13:38 GMT
Status:200 OK
transfer-encoding:chunked
Vary:Accept-Encoding
X-Rack-Cache:miss
然后我刷新页面,并得到
Cache-Control:private
Connection:keep-alive
Date:Tue, 16 Oct 2012 06:20:49 GMT
Status:304 Not Modified
X-Rack-Cache:miss
因此它似乎缓存工作。 如果这样的作品用于缓存那么什么是Expires和Cache-Control的观点:最大年龄 。 为了增加混乱,当我测试的页面在https://developers.google.com/speed/pagespeed/insights/它告诉我“杠杆浏览器缓存”。
要回答你关于为什么缓存工作的问题,即使在Web服务器没有包含头文件:
- 到期日:
[a date]
- 缓存控制:最大年龄=
[seconds]
服务器恳请任何中间代理不缓存的内容(即该项目应只在一个私人缓存缓存,即只在自己的本地机器上):
但服务器忘了,包括任何种类的缓存的提示:
- 他们忘了,包括到期 ,因此浏览器知道使用缓存的副本,直到日期
- 他们忘了,包括最大年龄 ,所以浏览器知道缓存的产品有多长好
- 他们忘了包括E-标签 ,这样浏览器就可以做一个条件请求
但他们没有包括在响应中的Last-Modified日期:
Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT
因为浏览器知道该文件的修改日期,它可以执行条件请求 。 它会向服务器请求的文件,但指示服务器只发送的文件,如果已自2012年10月16日3时13分38秒修改:
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
服务器收到请求,实现客户端有最新版本了。 而不是在客户端发送200 OK
,其次是网页的内容,而不是它告诉你,你的缓存版本是好的:
304 Not Modified
您的浏览器确实有遭受向服务器发送请求的延迟和等待响应,但它并保存不必重新下载静态内容。
为什么最大年龄 ? 为什么过期 ?
由于上次修改很烂。
在服务器上不是每件事都有一个与之相关联的日期。 如果我建设上飞一个页面,没有任何与之相关联的日期-这是现在 。 但我非常愿意让用户高速缓存中的网页15秒:
200 OK
Cache-Control: max-age=15
如果用户锤F5,他们会不断收到缓存的版本为15秒。 如果它是一个公司代理,那么所有67198个用户击中同一个15秒窗口在同一页面都将得到同样的内容 - 所有从接近缓存中。 性能取胜的每一个人。
加入美德Cache-Control: max-age
是,浏览器甚至不具备执行条件的要求。
- 如果你只指定
Last-Modified
,浏览器必须执行的请求If-Modified-Since
,并观看了304 Not Modified
响应 - 如果你指定
max-age
,浏览器甚至不会有遭受网络往返; 内容会来的权利,缓存的
之间的区别 “的Cache-Control:max-age的” 和 “过期”
Expires
是一个传统等效现代的(C 1998) Cache-Control: max-age
报头:
1998年以后写的应该不使用任何的网站Expires
了,而是使用max-age
。
什么是ETag的?
ETag的是类似于最后一次修改 ,但它并不一定是日期-它只是必须是一个东西 。
如果我拉的产品列表从数据库中,服务器可以发送最后的rowversion
作为ETag的,而不是一个日期:
200 OK
ETag: "247986"
我的ETag可以是静态资源(如图片,JS,CSS,字体)的SHA1哈希,或者缓存的网页呈现(即这是Mozilla MDN维基做了什么,他们凑最终的标记):
200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
而酷似基于上次修改条件要求的情况下:
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
304 Not Modified
我也能够对ETag的条件要求 :
GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
304 Not Modified
一个ETag
优于Last-Modified
,因为它工作的事情除了有最新的概念文件 ,或事物。 它只是为
Cache-Control: private
表明所有或响应消息的一部分是为单个用户并且不能由一个共享缓存被缓存,诸如代理服务器。
从RFC2616节14.9.1
RFC 2616, 节14.9.1 :
表明所有或响应消息的一部分是为单个用户并且不能由一个共享缓存...一个专用(非共享)高速缓存可以缓存响应被缓存。
浏览器可以使用这个信息。 当然,目前的“用户”可能意味着很多东西:OS用户,浏览器用户(例如Chrome浏览器的配置文件)等,没有指定真实。
对我来说, 更具体的例子 Cache-Control: private
是代理服务器(通常有许多用户)将不缓存它。 它的目的是为最终用户,并没有其他人。
仅供参考,在RFC明确指出,这并不能提供安全保障。 它是关于显示正确的内容,而不是固定的内容。
这个词私人的这种用法只能控制其中的响应可以被缓存,并不能保证邮件内容的私密性。
过期实体头字段给出的日期/时间之后,响应被认为stale.The缓存控制:最大生存周期字段给出年龄的值(以秒计)大于该响应是考虑陈旧。
Althought上述报头字段得到一种机制,客户端决定是否发送请求到服务器。 在某些情况下,客户端发送断绝和响应的年龄数值越大则达到maxage值的请求,剂量就意味着服务器需要将资源发送到客户端? 也许资源从来没有改变过。
为了解决这个问题,HTTP1.1给最后改性沥青头。 服务器给响应客户端的最后修改日期。 当客户需要这个资源,它将发送的If-Modified-由于头场服务器。 如果这个日期是种源的修改日期之前,服务器会发送资源到客户端,并给出200 code.Otherwise,它会返回304码到客户端,这意味着客户可以使用它的缓存资源。