aboutsummaryrefslogtreecommitdiff
path: root/files/ja/web/http/headers/cache-control/index.html
blob: 8b65881a997c1f18383ddeb0c933873246387428 (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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
---
title: Cache-Control
slug: Web/HTTP/Headers/Cache-Control
tags:
  - Cache-Control
  - HTTP
  - HTTP ヘッダー
  - Reference
  - 一般ヘッダー
translation_of: Web/HTTP/Headers/Cache-Control
---
<div>{{HTTPSidebar}}</div>

<p><span class="seoSummary"><strong><code>Cache-Control</code></strong> は HTTP のヘッダーで、リクエストとレスポンスの両方で<a href="/ja/docs/Web/HTTP/Caching">キャッシュ</a>のための<em>ディレクティブ</em> (指示) が格納されています。リクエストで指定されたディレクティブは、レスポンスでも同じディレクティブを使用しなければならないということではありません。</span></p>

<table class="properties">
 <tbody>
  <tr>
   <th scope="row">ヘッダー種別</th>
   <td>{{Glossary("General header", "一般ヘッダー")}}</td>
  </tr>
  <tr>
   <th scope="row">{{Glossary("Forbidden header name", "禁止ヘッダー名")}}</th>
   <td>いいえ</td>
  </tr>
  <tr>
   <th scope="row">{{Glossary("CORS-safelisted response header", "CORS セーフリストレスポンスヘッダー")}}</th>
   <td>はい</td>
  </tr>
 </tbody>
</table>

<h2 id="Syntax" name="Syntax">構文</h2>

<p>キャッシュのディレクティブには、以下のような規則があります。</p>

<ul>
 <li>大文字小文字の区別はありませんが、小文字が推奨されています。</li>
 <li>複数のディレクティブはカンマで区切ります。</li>
 <li>ディレクティブによってはオプションの引数があり、<em>トークン</em>または <em>quoted-string</em> のどちらかで指定します。 (定義については仕様書を参照)</li>
</ul>

<h3 id="Cache_request_directives" name="Cache_request_directives">リクエスト時のキャッシュディレクティブ</h3>

<p>クライアントからの HTTP リクエストで使用される可能性がある、標準的な <code>Cache-Control</code> ディレクティブです。</p>

<pre class="syntaxbox notranslate">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="Cache_response_directives" name="Cache_response_directives">レスポンス時のキャッシュディレクティブ</h3>

<p>サーバーからの HTTP レスポンスで使用される可能性がある、標準的な <code>Cache-Control</code> ディレクティブです。</p>

<pre class="syntaxbox notranslate">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="Extension_Cache-Control_directives" name="Extension_Cache-Control_directives">Cache-Control ディレクティブの拡張</h3>

<p><code>Cache-Control</code> ディレクティブの拡張は、 HTTP キャッシュ標準のコアドキュメントには含まれていません。対応状況については<a href="#Browser_compatibility">互換性一覧表</a>を確認してください。解釈できないユーザーエージェントはこれらを無視します。</p>

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

<h2 id="Directives" name="Directives">ディレクティブ</h2>

<h3 id="Cacheability" name="Cacheability">キャッシュ可能性</h3>

<p>ブラウザーがレスポンスをキャッシュするのは通常以下の場合です。</p>

<ul>
 <li>ステータスコードが {{HTTPStatus("301")}}, {{HTTPStatus("302")}}, {{HTTPStatus("307")}}, {{HTTPStatus("308")}}, {{HTTPStatus("410")}} の何れかで、<strong>かつ</strong></li>
 <li><code>Cache-Control</code><code>no-store</code> がないか、 もし<em>プロキシの場合は</em> <code>private</code> がなく、 <strong>かつ</strong></li>
 <li>{{HTTPHeader("Authorization")}} が設定されていない</li>
 <li>以下の何れかに該当する場合
  <ul>
   <li>ステータスコードが {{HTTPStatus("301")}}, {{HTTPStatus("302")}}, {{HTTPStatus("307")}}, {{HTTPStatus("308")}}, {{HTTPStatus("410")}} の何れか、<strong>または</strong></li>
   <li><code>public</code>, <code>max-age</code> <code>s-maxage</code> の何れかが <code>Cache-Control</code> に指定されている、<strong>または</strong></li>
   <li>{{HTTPHeader("Expires")}} が設定されている</li>
  </ul>
 </li>
</ul>

<dl>
 <dt><code>public</code></dt>
 <dd>レスポンスが通常はキャッシュ可能でなくても、レスポンスを<em>どの</em>キャッシュにも格納することができます。</dd>
 <dt><code>private</code></dt>
 <dd>レスポンスが通常はキャッシュ可能でなくても、<em>ブラウザーの</em>キャッシュにのみ格納することができます。<strong>レスポンスがどのキャッシュにも保存されないようにするには、代わりに <code>no-store</code> を使用してください。</strong><em>このディレクティブにはレスポンスがキャッシュに保存されないようにする効果はありません。</em></dd>
 <dt><code>no-cache</code></dt>
 <dd>レスポンスが通常はキャッシュ可能でなくても、レスポンスを<em>どの</em>キャッシュにも格納することができます。しかし、格納されたレスポンスは使用する前に<em>常に</em>元のサーバーとの検証を通さなければならないので、 <code>no-cache</code><code>immutable</code> と組み合わせて使用することはできません。<strong>レスポンスがどのキャッシュにも保存されないようにするには、代わりに <code>no-store</code> を使用してください。</strong><em>このディレクティブにはレスポンスがキャッシュに保存されないようにする効果はありません。</em></dd>
 <dt><code>no-store</code></dt>
 <dd>レスポンスをキャッシュに保存することは<strong>できません</strong>。他のディレクティブを設定することもできますが、最近のブラウザーでは<em>レスポンスがキャッシュされることを防ぐために必要なディレクティブはこれだけ</em>です。 <code>max-age=0</code> <strong>が暗黙で含まれます</strong><code>must-revalidate</code> <strong>は意味を持ちません</strong>。再検証を行うにはレスポンスがキャッシュに格納されている必要がありますが、 <code>no-store</code> はこれを抑止するからです。</dd>
</dl>

<h3 id="Expiration" name="Expiration">有効期限</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>クライアントが、<em>少なくとも</em>指定された秒数の間は新しいままのレスポンスを要求していることを示します。</dd>
 <dt><code>stale-while-revalidate=&lt;seconds&gt;</code> {{Experimental_Inline}}</dt>
 <dd>クライアントが古いレスポンスを受け入れ、新しいレスポンスをバックグラウンドで非同期にチェックすることを示します。 <em>seconds</em> の値は、クライアントが古いレスポンスを受け入れる時間を示します。詳細については、「<a href="https://web.dev/stale-while-revalidate">Keeping things fresh with <code>stale-while-revalidate</code></a>」を参照してください。</dd>
 <dt><code>stale-if-error=&lt;seconds&gt;</code> {{Experimental_Inline}}</dt>
 <dd>新しいレスポンスのチェックに失敗した場合に、クライアントが古いレスポンスを受け入れることを示します。 <em>seconds</em> の値は、当初の有効期限が切れた後に、クライアントが古いレスポンスを受け入れる時間を示します。</dd>
</dl>

<h3 id="Revalidation_and_reloading" name="Revalidation_and_reloading">再検証と再読み込み</h3>

<dl>
 <dt><code>must-revalidate</code></dt>
 <dd>一度リソースが古くなると、キャッシュは元のサーバーでの<a href="/ja/docs/Web/HTTP/Caching#Cache_validation">検証</a>が成功しない限り、古くなったコピーを使用してはならないことを示します。</dd>
 <dt><code>proxy-revalidate</code></dt>
 <dd><code>must-revalidate</code> と似ていますが、共有キャッシュ (プロキシなど) にのみ適用されます。プライベートキャッシュでは無視されます。</dd>
 <dt><code>immutable</code></dt>
 <dd>時間が経ってもレスポンスの本文が<strong>変化しない</strong>ことを示します。リソースは、<em>期限切れでない限り</em>、サーバー上で変化していないため、クライアントは、たとえユーザーが明示的にページを更新した場合でも、更新をチェックするために条件付きの再検証 (<code>If-None-Match</code><code>If-Modified-Since</code> など) を送ってはいけません。この拡張機能を実装していないクライアントは、 HTTP の仕様に従ってこれらの拡張機能を無視しなければなりません。 Firefox では、 <code>immutable</code><code>https://</code> トランザクションでのみ有効です。詳しくは、こちらの<a href="https://bitsup.blogspot.de/2016/05/cache-control-immutable.html">ブログ記事</a>を参照してください。</dd>
</dl>

<h3 id="Other" name="Other">その他</h3>

<dl>
 <dt><code>no-transform</code></dt>
 <dd>中間キャッシュやプロキシが、レスポンスの本文、 {{HTTPHeader("Content-Encoding")}}, {{HTTPHeader("Content-Range")}}, {{HTTPHeader("Content-Type")}} を変更してはいけません。したがって、 <a href="https://support.google.com/webmasters/answer/6211428">Google’s Web Light</a> のようなプロキシやブラウザーの機能を使用して、キャッシュの格納や遅いコネクションにおいてデータを最小化するために画像を変換してはいけません。</dd>
 <dt><code>only-if-cached</code></dt>
 <dd><em>クライアント</em>によって設定され、レスポンスのために「ネットワークを使用しない」ことを示します。キャッシュは、保存されたレスポンスを使用して応答するか、 {{HTTPStatus("504")}} ステータスコードで応答する必要があります。 <code>If-None-Match</code> などの条件付きヘッダーは設定すべきではありません。サーバーがレスポンスの一部として <code>only-if-cached</code> を設定しても効果はありません。</dd>
</dl>

<h2 id="Examples" name="Examples"></h2>

<h3 id="Preventing_caching" name="Preventing_caching">キャッシュの防止</h3>

<p>リソースのキャッシュを無効にするには、以下のレスポンスヘッダーを送ることができます。</p>

<dl>
 <dt>良い例:</dt>
 <dd>
 <pre class="example-good brush: http no-line-numbers notranslate">Cache-Control: no-store</pre>

 <div class="blockIndicator note">
 <p> <code>no-store</code> ディレクティブは、新しいリソースがキャッシュされることを防ぎますが、過去のリクエストの結果としてキャッシュ済みの古いリソースが応答するのを防ぐことはできません。 <code>max-age=0</code> を設定すると、キャッシュが強制的に再検証されます(キャッシュがクリアされます)。</p>

 <pre class="syntaxbox notranslate">Cache-Control: no-store, max-age=0
</pre>
 </div>
 </dd>
 <dt>悪い例:</dt>
 <dd>
 <pre class="example-bad brush: http no-line-numbers notranslate">Cache-Control: private,no-cache,no-store,max-age=0,must-revalidate,pre-check=0,post-check=0</pre>
 </dd>
</dl>

<h3 id="Caching_static_assets" name="Caching_static_assets">静的な資産のキャッシュ</h3>

<p>変更されないアプリケーション内のファイルについては、通常、以下のレスポンスヘッダーを送信することで積極的にキャッシュを行うことができます。これには、例えば画像、 CSS ファイル、 JavaScript ファイルなど、アプリケーションによって提供される静的なファイルが含まれます。加えて、 {{HTTPHeader("Expires")}} ヘッダーも参照してください。</p>

<pre class="brush: http no-line-numbers notranslate">Cache-Control: public, max-age=604800, immutable
</pre>

<h3 id="Requiring_revalidation" name="Requiring_revalidation">再検証の要求</h3>

<p><code>no-cache</code> または <code>max-age=0</code> を指定すると、クライアントはリソースをキャッシュすることができ、それを使用する前に毎回再検証をしなければならないことを示します。これは、 HTTP リクエストが毎回発生することを意味しますが、コンテンツが有効であれば、 HTTP 本文のダウンロードを飛ばすことができます。</p>

<pre class="brush: http no-line-numbers notranslate">Cache-Control: no-cache
Cache-Control: no-cache, max-age=0
</pre>

<h2 id="Specifications" name="Specifications">仕様書</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">仕様書</th>
   <th scope="col">状態</th>
   <th scope="col">備考</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>初回定義</td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザーの互換性</h2>

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

<h2 id="See_also" name="See_also">関連情報</h2>

<ul>
 <li><a href="/ja/docs/Web/HTTP/Caching_FAQ">HTTP キャッシュ 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>