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
229
230
231
232
233
234
235
236
237
238
239
240
|
---
title: Cache-Control
slug: Web/HTTP/Headers/Cache-Control
tags:
- Cache-Control
- General Header
- HTTP
- HTTP Headers
- Reference
translation_of: Web/HTTP/Headers/Cache-Control
---
<p>{{HTTPSidebar}}</p>
<p><span class="seoSummary">L'en-tête HTTP <strong><code>Cache-Control</code></strong> contient des directives (ou instructions) pour la <a href="/fr/docs/Web/HTTP/Cache">mise en cache</a> tant dans les requêtes que dans les réponses. Une directive donnée dans une requête ne signifie pas que la même directive doit se trouver dans la réponse.</span></p>
<table class="properties">
<tbody>
<tr>
<th scope="row">Type d'en-tête</th>
<td>{{Glossary("General header")}}</td>
</tr>
<tr>
<th scope="row">{{Glossary("Forbidden header name")}}</th>
<td>non</td>
</tr>
<tr>
<th scope="row">{{Glossary("CORS-safelisted response header")}}</th>
<td>oui</td>
</tr>
</tbody>
</table>
<h2 id="Syntaxe">Syntaxe</h2>
<p>Pour être valables, les directives de mise en cache doivent respecter les règles suivante :</p>
<ul>
<li>Il est recommandé de ne pas faire de distinction entre les majuscules et les minuscules..</li>
<li>Les directives multiples sont séparées par des virgules.</li>
<li>Certaines directives ont un argument optionnel, qui peut être soit un <em>jeton</em>, soit une chaîne de caractères entre guillemets. (Voir les spécifications pour les définitions)</li>
</ul>
<h3 id="Règles_de_cache_des_requêtes">Règles de cache des requêtes</h3>
<p>Les règles standard <code>Cache-Control</code> suivantes peuvent être utilisées par un client HTTP dans une requête :</p>
<pre class="syntaxbox">Cache-Control: max-age=<seconds>
Cache-Control: max-stale[=<seconds>]
Cache-Control: min-fresh=<seconds>
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: no-transform
Cache-Control: only-if-cached
</pre>
<h3 id="Règles_de_cache_des_réponses">Règles de cache des réponses</h3>
<p>Les règles standard <code>Cache-Control</code> suivantes peuvent être utilisées par un serveur HTTP dans une réponse :</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=<seconds>
Cache-Control: s-maxage=<seconds>
</pre>
<h3 id="Extensions_de_Cache-Control">Extensions de <code>Cache-Control</code></h3>
<p>Les directives Extension <code>Cache-Control</code> ne font pas partie du document sur les normes de base de la mise en cache HTTP. Vérifiez leur prise en charge dans la <a href="#Browser_compatibility">table de compatibilité</a> ; les agents-utilisateurs qui ne les reconnaissent pas doivent les ignorer.</p>
<pre class="syntaxbox">Cache-Control: immutable
Cache-Control: stale-while-revalidate=<seconds>
Cache-Control: stale-if-error=<seconds>
</pre>
<h2 id="Directives">Directives</h2>
<h3 id="Possibilité_de_mise_en_cache">Possibilité de mise en cache</h3>
<p>Une réponse est normalement mise en cache par le navigateur si</p>
<ul>
<li>il a un code de statut de <code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Status/301">301</a></code>, <code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Status/302">302</a></code>, <code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Status/307">307</a></code>, <code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Status/308">308</a></code>, or <code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Status/410">410</a></code> <strong>et</strong></li>
<li><code>Cache-Control</code> n'a pas de <code>no-store</code>, ou <em>s'il s'agit d'un mandataire</em>, il n'a pas d'adresse <code>privée</code> <strong>et</strong></li>
<li><code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization">Authorization</a></code> n'est pas fixée</li>
<li>soit
<ul>
<li>a un code de statut de <code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Status/301">301</a></code>, <code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Status/302">302</a></code>, <code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Status/307">307</a></code>, <code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Status/308">308</a></code>, ou <code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Status/410">410</a></code> <strong>ou</strong></li>
<li>a un <code>public</code>, <code>max-age</code> ou <code>s-maxage</code> dans <code>Cache-Control</code> <strong>ou</strong></li>
<li>a <code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expires">Expires</a></code> fixé</li>
</ul>
</li>
</ul>
<dl>
<dt><code>public</code></dt>
<dd>Indique que la réponse peut être mise en cache par n'importe quel cache.</dd>
<dt><code>private</code></dt>
<dd>Indique que la réponse ne doit être mise en cache que pour un utilisateur donné et ne doit donc pas être mise en cache par un cache partagé.</dd>
<dt><code>no-cache</code></dt>
<dd>Indique de renvoyer systématiquement la requête au serveur et ne servir une éventuelle version en cache que dans le cas où le serveur le demande.</dd>
<dt><code>no-store</code></dt>
<dd>La réponse <strong>ne</strong> peut être stockée dans<em> aucune</em> mémoire cache. Bien que d'autres directives puissent être définies, C'est la seule directive dont vous avez besoin pour empêcher le réponses en cache sur les navigateurs modernes. <code>max-age=0</code> <strong>est déjà implicite</strong>. <strong>La définition de la directive</strong> <code>must-revalidate</code> <strong>n'a pas de sens</strong> car pour passer la revalidation, vous devez stocker la réponse dans un cache, ce que n'empêche <code>no-store</code>.</dd>
<dd><strong>Ne pas copier-coller les spécifications Internet-Explorer</strong> <code>pre-check=0,post-check=0</code> Si vous le voyez en ligne car il est entièrement ignoré, ce que confirme le <a href="https://twitter.com/ericlaw/status/685201170260819968">tweet du développeur Edge</a>.</dd>
<dt>Désactive le cache par Cache-Control</dt>
<dd>
<pre class="example-good">no-store</pre>
</dd>
<dd>
<pre class="example-bad">no-cache,no-store,must-revalidate,pre-check=0,post-check=0</pre>
</dd>
</dl>
<h3 id="Expiration">Expiration</h3>
<dl>
<dt><code>max-age=<secondes></code></dt>
<dd>Indique la durée pendant laquelle la ressource doit être considérée comme valide (non expirée). Contrairement à <code>expires</code>, la durée indiquée dans cette directive commence à la date de la requête.</dd>
<dt><code>s-maxage=<secondes></code></dt>
<dd>Indique une valeur pour écraser les valeurs définies par <code>max-age</code> ou <code>Expires</code> pour les caches partagés (comme les proxies). Il est donc ignoré par les caches privés (dont les navigateurs).</dd>
<dt><code>max-stale[=<secondes>]</code></dt>
<dd>Indique que le client accepte une réponse expirée. Une valeur optionnelle permet d'indiquer la durée maximale depuis laquelle la réponse peut être expirée mais acceptée quand même.</dd>
<dt><code>min-fresh=<secondes></code></dt>
<dd>Indique que le client demande une réponse qui soit valide pour au moins la durée demandée (dont la date d'expiration est supérieure à la date actuelle plus la durée spécifiée).</dd>
<dt><code>stale-while-revalidate=<secondes></code> {{experimental_inline}}</dt>
<dd>Indique au cache de renvoyer les données en cache même si elles sont expirée depuis une durée inférieure à la durée spécifiée dans l'en-tête. Dans ce cas, le cache doit renvoyer la requête au serveur pour rafraîchir les données.</dd>
<dt><code>stale-if-error=<secondes></code> {{experimental_inline}}</dt>
<dd>Indique au cache de renvoyer les données en cache s'il y a une erreur pendant la récupération des données auprès du serveur et que la version en cache est expirée depuis une durée inférieure à celle spécifiée dans l'en-tête.</dd>
</dl>
<h3 id="Revalidation_et_rechargement">Revalidation et rechargement</h3>
<dl>
<dt><code>must-revalidate</code></dt>
<dd>Le cache doit refaire une requête dans le cas où les données sont expirées afin de les mettre à jour s'il y a lieu (il reste parfaitement possible que le serveur réponde avec les mêmes données).</dd>
<dt><code>proxy-revalidate</code></dt>
<dd>Comme pour <code>must-revalidate</code>, mais force la valeur pour les caches partagés. Cette valeur est ignorée par les caches locaux.</dd>
<dt><code>immutable</code></dt>
<dd>Indique que les données renvoyées peuvent être servies même si elles sont expirées sans aucune validation et même si le client fait une demande explicite de rafraîchissement. Cette option est a priori uniquement adaptée si les contenus ne sont jamais modifiés mais toujours stockés à une URI différente (par exemple en utilisant un hash du contenu). Les clients qui ne gèrent pas cette directive l'ignorent. Dans le cas de Firefox, cette option est aussi ignorée pour les contenus qui ne sont pas servis en HTTPS. Pour plus d'informations, on pourra se référer à <a href="http://bitsup.blogspot.de/2016/05/cache-control-immutable.html">un blog en anglais</a>.</dd>
</dl>
<h3 id="Autres">Autres</h3>
<dl>
<dt><code>no-transform</code></dt>
<dd>Aucune conversion ou transformation ne devraient être réalisée sur la ressource. Ainsi, les en-tête <code>Content-Encoding</code>, <code>Content-Range</code> et <code>Content-Type</code> ne devraient jamais être modifiés par un proxy (serveur mandataire). Un proxy non-transparent pourrait, en l'absence de cet en-tête, convertir ou compresser (avec pertes) des images pour réduire la place occupée en cache ou diminuer le volume de données à transférer sur un lien lent.</dd>
<dt><code>only-if-cached</code></dt>
<dd>Réglé par le <em>client </em>pour indiquer "ne pas utiliser le réseau" pour la réponse. Le cache doit soit répondre en utilisant une réponse stockée, soit répondre avec un code d'état <code><a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTTP/Status/504">504</a></code>. Les en-têtes conditionnels tels que <code>If-None-Match</code> ne doivent pas être définis. Il n'y a aucun effet si <code>only-if-cached</code> est défini par un serveur dans le cadre d'une réponse.</dd>
</dl>
<h2 id="Exemples">Exemples</h2>
<h3 id="Prévention_de_la_mise_en_cache">Prévention de la mise en cache</h3>
<p>Pour désactiver la mise en cache, vous pouvez envoyer l'en-tête de réponse suivant. En outre, voir aussi les en-têtes <code>Expires</code> et <code>Pragma</code>.</p>
<dl>
<dd>
<pre class="example-good brush: http no-line-numbers">Cache-Control: no-store
</pre>
</dd>
<dd>
<pre class="example-bad brush: http no-line-numbers">Cache-Control: private,no-cache,no-store,max-age=0,must-revalidate,pre-check=0,post-check=0
</pre>
</dd>
</dl>
<h3 id="Mise_en_cache_dactifs_statiques">Mise en cache d'actifs statiques</h3>
<p>Pour les fichiers de l'application qui ne seront pas modifiés, vous pouvez généralement ajouter une mise en cache agressive en envoyant l'en-tête de réponse ci-dessous. Cela inclut les fichiers statiques qui sont servis par l'application comme les images, les fichiers CSS et les fichiers JavaScript, par exemple. En outre, voir l'en-tête <code>Expires</code>.</p>
<dl>
<dd>
<pre class="brush: http no-line-numbers">Cache-Control: public, max-age=604800, immutable
</pre>
</dd>
</dl>
<h3 id="Nécessitant_une_revalidation">Nécessitant une revalidation</h3>
<p>Le fait de spécifier <font face="consolas, Liberation Mono, courier, monospace"><span style="background-color: rgba(220, 220, 220, 0.5);">no-cache</span></font> ou <code>max-age=0</code> indique que les clients peuvent mettre une ressource en cache et doivent la revalider à chaque fois avant de l'utiliser. Cela signifie que la requête HTTP se produit à chaque fois, mais qu'elle peut sauter le téléchargement du corps HTTP si le contenu est valide.</p>
<dl>
<dd>
<pre class="brush: http no-line-numbers">Cache-Control: no-cache
Cache-Control: no-cache, max-age=0
Cache-Control: no-cache, max-age=0, stale-while-revalidate=300
</pre>
</dd>
</dl>
<h2 id="Spécifications">Spécifications</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="Compatibilité_avec_les_navigateurs">Compatibilité avec les navigateurs</h2>
<p>{{Compat("http.headers.Cache-Control")}}</p>
<h2 id="Voir_aussi">Voir aussi</h2>
<ul>
<li><a href="/en-US/docs/Web/HTTP/Caching_FAQ">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>
|