aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/http/headers/cache-control/index.html
blob: ec6bddf5978fae3aafceaa3a6e7946952fd6ed3e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
---
title: Cache-Control
slug: Web/HTTP/Headers/Cache-Control
tags:
  - Cache-Control
  - HTTP
  - 请求头
translation_of: Web/HTTP/Headers/Cache-Control
---
<div>{{HTTPSidebar}}</div>

<p><code><font face="Open Sans, Arial, sans-serif"> </font><strong>Cache-Control</strong></code> 通用消息头字段,被用于在http请求和响应中,通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中。</p>

<table class="properties">
 <tbody>
  <tr>
   <th scope="row">Header type </th>
   <td>{{Glossary("General header")}}</td>
  </tr>
  <tr>
   <th scope="row">{{Glossary("Forbidden header name")}}</th>
   <td>no</td>
  </tr>
  <tr>
   <th scope="row">{{Glossary("Simple response header", "CORS-safelisted response-header")}}</th>
   <td>yes</td>
  </tr>
 </tbody>
</table>

<h2 id="语法">语法</h2>

<p>指令格式具有以下有效规则:</p>

<ul>
 <li>不区分大小写,但建议使用小写。</li>
 <li>多个指令以逗号分隔。</li>
 <li>具有可选参数,可以用令牌或者带引号的字符串语法。</li>
</ul>

<h3 id="缓存请求指令">缓存请求指令</h3>

<p>客户端可以在HTTP请求中使用的标准 Cache-Control 指令。</p>

<pre class="syntaxbox">Cache-Control: max-age=&lt;seconds&gt;
Cache-Control: max-stale[=&lt;seconds&gt;]
Cache-Control: min-fresh=&lt;seconds&gt;
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: only-if-cached
</pre>

<h3 id="缓存响应指令">缓存响应指令</h3>

<p>服务器可以在响应中使用的标准 Cache-Control 指令。</p>

<pre class="syntaxbox">Cache-control: must-revalidate
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=&lt;seconds&gt;
Cache-control: s-maxage=&lt;seconds&gt;
</pre>

<h3 id="扩展Cache-Control指令"> 扩展<code>Cache-Control</code>指令</h3>

<p>拓展缓存指令不是核心HTTP缓存标准文档的一部分,使用前请注意检查<a href="#浏览器兼容性">兼容性</a></p>

<pre class="syntaxbox">Cache-control: immutable
Cache-control: stale-while-revalidate=&lt;seconds&gt;
Cache-control: stale-if-error=&lt;seconds&gt;
</pre>

<h2 id="指令">指令</h2>

<h3 id="可缓存性">可缓存性</h3>

<dl>
 <dt><code>public</code></dt>
 <dd>表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,即使是通常不可缓存的内容。(例如:1.该响应没有<code>max-age</code>指令或<code>Expires</code>消息头;2. 该响应对应的请求方法是 <a href="/zh-CN/docs/Web/HTTP/Methods/POST">POST</a> 。)</dd>
 <dt><code>private</code></dt>
 <dd>表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器。</dd>
 <dt><code>no-cache</code></dt>
 <dd>在发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证(协商缓存验证)。</dd>
 <dt><code>no-store</code></dt>
 <dd>缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存。</dd>
</dl>

<h3 id="到期">到期</h3>

<dl>
 <dt><code>max-age=&lt;seconds&gt;</code></dt>
 <dd>设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。与<code>Expires</code>相反,时间是相对于请求的时间。</dd>
 <dt><code>s-maxage=&lt;seconds&gt;</code></dt>
 <dd>覆盖<code>max-age</code>或者<code>Expires</code>头,但是仅适用于共享缓存(比如各个代理),私有缓存会忽略它。</dd>
 <dt><code>max-stale[=&lt;seconds&gt;]</code></dt>
 <dd>表明客户端愿意接收一个已经过期的资源。可以设置一个可选的秒数,表示响应不能已经过时超过该给定的时间。</dd>
 <dt><code>min-fresh=&lt;seconds&gt;</code></dt>
 <dd>表示客户端希望获取一个能在指定的秒数内保持其最新状态的响应。</dd>
 <dt><code>stale-while-revalidate=&lt;seconds&gt;</code> {{experimental_inline}}</dt>
 <dd>表明客户端愿意接受陈旧的响应,同时在后台异步检查新的响应。秒值指示客户愿意接受陈旧响应的时间长度。</dd>
 <dt><code>stale-if-error=&lt;seconds&gt;</code> {{experimental_inline}}</dt>
 <dd>表示如果新的检查失败,则客户愿意接受陈旧的响应。秒数值表示客户在初始到期后愿意接受陈旧响应的时间。</dd>
</dl>

<h3 id="重新验证和重新加载">重新验证和重新加载</h3>

<dl>
 <dt><code>must-revalidate</code></dt>
 <dd>一旦资源过期(比如已经超过<code>max-age</code>),在成功向原始服务器验证之前,缓存不能用该资源响应后续请求。</dd>
 <dt><code>proxy-revalidate</code></dt>
 <dd>与must-revalidate作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。</dd>
 <dt><code>immutable</code> {{experimental_inline}}</dt>
 <dd>表示响应正文不会随时间而改变。资源(如果未过期)在服务器上不发生改变,因此客户端不应发送重新验证请求头(例如<code>If-None-Match</code>或I<code>f-Modified-Since</code>)来检查更新,即使用户显式地刷新页面。在Firefox中,immutable只能被用在 <code>https://</code> transactions. 有关更多信息,请参阅<a href="http://bitsup.blogspot.de/2016/05/cache-control-immutable.html">这里</a></dd>
</dl>

<h3 id="其他">其他</h3>

<dl>
 <dt><code>no-transform</code></dt>
 <dd>不得对资源进行转换或转变。<code>Content-Encoding</code><code>Content-Range</code><code>Content-Type</code>等HTTP头不能由代理修改。例如,非透明代理或者如<a href="https://support.google.com/webmasters/answer/6211428?hl=en">Google's Light Mode</a>可能对图像格式进行转换,以便节省缓存空间或者减少缓慢链路上的流量。<code>no-transform</code>指令不允许这样做。</dd>
 <dt><code>only-if-cached</code></dt>
 <dd>表明客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝。</dd>
</dl>

<h2 id="示例">示例</h2>

<h3 id="禁止缓存">禁止缓存</h3>

<p>发送如下响应头可以关闭缓存。此外,可以参考<code>Expires</code><code>Pragma</code>消息头。</p>

<pre>Cache-Control: no-store
</pre>

<h3 id="缓存静态资源">缓存静态资源</h3>

<p>对于应用程序中不会改变的文件,你通常可以在发送响应头前添加积极缓存。这包括例如由应用程序提供的静态文件,例如图像,CSS文件和JavaScript文件。另请参阅Expires标题。</p>

<pre>Cache-Control:public, max-age=31536000</pre>

<h3 id="需要重新验证">需要重新验证</h3>

<p>指定 <code>no-cache</code> 或 <code>max-age=0, must-revalidate</code> 表示客户端可以缓存资源,每次使用缓存资源前都必须重新验证其有效性。这意味着每次都会发起 HTTP 请求,但当缓存内容仍有效时可以跳过 HTTP 响应体的下载。</p>

<pre class="brush: http">Cache-Control: no-cache</pre>

<pre class="brush: http">Cache-Control: max-age=0, must-revalidate</pre>

<p><strong>注意</strong>: 如果服务器关闭或失去连接,下面的指令可能会造成使用缓存。</p>

<pre class="brush: http">Cache-Control: max-age=0</pre>

<h2 id="规范">规范</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">Specification</th>
   <th scope="col">Status</th>
   <th scope="col">Comment</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{RFC(8246, "HTTP Immutable Responses")}}</td>
   <td><span class="spec-RFC">IETF RFC</span></td>
   <td></td>
  </tr>
  <tr>
   <td>{{RFC(7234, "Hypertext Transfer Protocol (HTTP/1.1): Caching")}}</td>
   <td><span class="spec-RFC">IETF RFC</span></td>
   <td></td>
  </tr>
  <tr>
   <td>{{RFC(5861, "HTTP Cache-Control Extensions for Stale Content")}}</td>
   <td><span class="spec-RFC">IETF RFC</span></td>
   <td>Initial definition</td>
  </tr>
 </tbody>
</table>

<h2 id="浏览器兼容性">浏览器兼容性</h2>

<p>{{Compat("http.headers.Cache-Control")}}</p>

<h2 id="参见">参见</h2>

<ul>
 <li><a href="/zh-CN/docs/Web/HTTP/Caching">HTTP Caching FAQ</a></li>
 <li><a href="https://www.mnot.net/cache_docs/">Caching Tutorial for Web Authors and Webmasters</a></li>
 <li>Guide: <em><a href="https://csswizardry.com/2019/03/cache-control-for-civilians"><code>Cache-Control</code> for civilians</a></em></li>
 <li>{{HTTPHeader("Age")}}</li>
 <li>{{HTTPHeader("Expires")}}</li>
 <li>{{HTTPHeader("Pragma")}}</li>
</ul>