浏览器缓存机制,其实主要就是http
协议定义的缓存机制(如:Expires
,Cache-control
等).但也有非http
协议定义的缓存机制,如使用HTML Meta
标签,web 开发者能够在html页面的<head>中加入<meta>标签,代码以下:css
<meta http-equiv='Pragma' content="no-cache">
上述代码的做用就是告诉浏览器当前页面不被缓存,每次访问都须要去服务器拉取。使用上很简单,但只有部分浏览器能够支持,并且全部缓存代理服务都不支持
,由于代理不解析html
内容自己。html
能够说这些内容能够说基本没有什么卵用:)nginx
expires
是web
服务器响应消息头字段,在响应http
请求时告诉浏览器在过时时间前浏览器能够直接从浏览器缓存取数据,而无需再次请求。web
好比查看百度首页浏览器
注:Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date: Mon,31 Dec 2017 04:25:57GMT缓存
web 服务器告诉浏览器在
2017-08-26 03:31:29 GMT
这个时间点以前,可使用缓存文件,发送时间为2017-08-08 06:41:32 GMT
。服务器
不过Expires 是HTTP 1.0的东西,如今默认浏览器均默认使用HTTP 1.1,因此它的做用基本忽略。因此能够重点看cache-control
ui
cache-control
cache-control
与expires
的做用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据仍是从新发请求到服务器取数据。只不过cache-control的选择更多,设置更细致,若是同时设置的话,其优先级高于Expires
。spa
http协议头中cache-control:代理
值能够是public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age 各个消息中的指令含义以下: 1. public 指示响应可被任何缓存区缓存 2. Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这容许服务器仅仅描述当用户的部分响应消息,此响应消息对于其余用户的请求无效。 3.no-cache指示请求或响应消息不能缓存 4.no-store用于防止重要的信息被无心的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 5.max-age指示客户机能够接收生存期不大于指定时间(以秒为单位)的响应。 6.min-fresh指示客户机能够接收响应时间小于当前时间加上指定时间的响应 7.max-stale指示客户机能够接收超出超时期间的响应消息。若是指定max-stale消息的值,那么客户机能够接收超出超时期指定值以内的响应消息。
Last-Modified/If-Modified-Since
简介
Last-Modified/If-Modified-Since
要配合cache-Control
使用。
Last-Modified
:标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。
If-Modified-Since
:当资源过时时(使用Cache-Control
标识的max-age
),发现资源具备Last-Modified
声明,则再次向web
服务器请求时带上头If-Modified-Since
,表示请求时间。web
服务器收到请求后发现有头If-Modified-Since
则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304
(无需包体,节省浏览),告知浏览器继续使用所保存的cache
。
Etag/If-None-Match
简介
Etag/If-None-Match
也要配合Cache-Control
使用。
Etag
:web
服务器响应请求时,告诉浏览器当前资源在服务器的惟一标识(生成规则由服务器生成)
。
If-None-Match
:当资源过时时(使用Cache-Control
标识的max-age
),发现资源具备Etage声明,则再次向web服务器请求时带上头If-None-Match (Etag的值)。web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定返回200
或304
。
Last-Modified
何生Etag
?你可能会以为使用Last-Modified
已经足以让浏览器知道本地的缓存副本是否足够新,为何还须要Etag
(实体标识)呢?HTTP1.1
中Etag
的出现主要是为了解决几个Last-Modified
比较难解决的问题:
Last-Modified
标注的最后修改只能精确到秒级,若是某些文件在1秒钟之内,被修改屡次的话,它将不能准确标注文件的修改时间
若是某些文件会被按期生成,但有时内容并无任何变化,但Last-Modified
却改变了,致使文件无法使用缓存
有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形
Etag
是服务器自动生成或者由开发者生成的对应资源在服务器端的惟一标识符,可以更加准确的控制缓存。Last-Modified
与ETag
是能够一块儿使用的,服务器会优先验证ETag
,一致的状况下,才会继续比对Last-Modified
,最后才决定是否返回304
。
浏览器缓存行为还有用户的行为有关!!!
用户操做 | expires/cache-control |
last-modified/etag |
---|---|---|
地址栏回车 | 有效 | 有效 |
页面连接跳转 | 有效 | 有效 |
新开窗口 | 有效 | 有效 |
前进、后退 | 有效 | 有效 |
F5 刷新 |
无效 |
有效 |
ctrl+F5 刷新 |
无效 |
无效 |
浏览器第一次访问:
浏览器再次请求时:
nginx
添加缓存若是你想节省资源和带宽,引入浏览器缓存不失为一个好的方案。这里,主要针对一些静态文件。
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { access_log off; log_not_found off; expires 360d; }
原文做者:吴秦