260 votes

Comment définir les en-têtes HTTP (pour le cache-control) ?

Comment activer la mise en cache du navigateur pour mon site ? Dois-je simplement mettre cache-control:public quelque part dans mon en-tête comme ceci ?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
Cache-Control:public;
>

J'utilise la dernière version de PHP et je développe sur la dernière version de XAMPP.

0 votes

Quel langage côté serveur utilisez-vous ? PHP ?, ASP ?, JSP ? la façon dont vous définissez les en-têtes est similaire mais pas tout à fait la même. Ou si vous mettez en cache des images... cela se fait souvent dans la configuration d'Apache (ou du serveur Web).

0 votes

Malheureusement, cette "solution" génère simplement un DOCTYPE invalide ;-) Si vous souhaitez le faire à partir de HTML (je ne vous le recommande pas), vous utiliseriez MÉTA HTTP-EQUIV

223voto

Codemwnci Points 28817

Pour utiliser le contrôle de cache en HTML, vous utilisez l'option méta-tag par exemple

<meta http-equiv="Cache-control" content="public">

La valeur du champ de contenu est définie comme l'une des quatre valeurs ci-dessous.

Quelques informations sur le Cache-Control L'en-tête est le suivant

HTTP 1.1. Valeurs autorisées = PUBLIC | PRIVATE | NO-CACHE | NO-STORE.

Public - peut être mis en cache dans des caches partagés publics.
Privé - ne peut être mis en cache que dans un cache privé.
No-Cache - ne peut pas être mis en cache.
No-Store - peut être mis en cache mais pas archivé.

La directive CACHE-CONTROL:NO-CACHE indique que les informations mises en cache ne doivent pas être utilisées. et que les demandes doivent être transmises au serveur d'origine. Cette directive a la même sémantique que la directive PRAGMA:NO-CACHE.

Clients DEVRAIT inclure à la fois PRAGMA : NO-CACHE et CACHE-CONTROL : NO-CACHE lorsqu'une requête no-cache est envoyée à un serveur dont on ne sait pas s'il est conforme à la norme HTTP/1.1. Voir également EXPIRES.

Remarque : il peut être préférable de spécifier les commandes de cache dans HTTP plutôt que dans les déclarations META, où elles peuvent influencer non seulement le navigateur, mais aussi les proxies et autres intermédiaires susceptibles de mettre des informations en cache.

45 votes

HTML5 l'interdit y <meta> a toujours été un moyen terrible et peu fiable de spécifier la mise en cache.

3 votes

@porneL J'ai du mal à comprendre quelle partie de vos liens interdit quelle partie de la réponse... les méta-tags ne disent rien sur le fait de ne pas aimer ce qui est écrit ici, ou de l'interdire ?

1 votes

@FélixGagnon-Grenier "L'attribut http-equiv est un attribut énuméré" signifie qu'il n'autorise que les valeurs du tableau de la spécification. Elle mentionne même la mise en cache dans la section suivante ("other pragma directives") : > Les directives pragma correspondant à des en-têtes qui affectent le modèle de traitement HTTP (par exemple la mise en cache) ne doivent pas être enregistrées, car elles auraient pour conséquence que le comportement au niveau HTTP serait différent pour les agents utilisateurs qui implémentent le HTML et pour les agents utilisateurs qui ne le font pas.

145voto

scunliffe Points 30964

Vous pouvez définir les en-têtes en PHP en utilisant :

<?php
  //set headers to NOT cache a page
  header("Cache-Control: no-cache, must-revalidate"); //HTTP 1.1
  header("Pragma: no-cache"); //HTTP 1.0
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

  //or, if you DO want a file to cache, use:
  header("Cache-Control: max-age=2592000"); //30days (60sec * 60min * 24hours * 30days)

?>

Notez que les en-têtes exactes utilisées dépendront de vos besoins (et si vous devez supporter HTTP 1.0 et/ou HTTP 1.1 )

4 votes

Pragma y Expires sont probablement redondants pour la grande majorité des navigateurs. fastly.com/blog/headers-we-dont-want

2 votes

@thijsai ouais HTTP/1.0 est massivement dépassé aussi... utilisez seulement les en-têtes dont vous avez besoin en fonction de votre matrice d'utilisateur

0 votes

Pour une meilleure compréhension du contrôle de cache, voir csswizardry.com/2019/03/cache-control-for-civilians

67voto

William Points 91

Comme je l'ai écrit il est préférable d'utiliser le fichier .htaccess . Attention toutefois au temps que vous laissez le contenu dans le cache.

Utilisez :

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

Où : 604800 = 7 jours

PS : Ceci peut être utilisé pour réinitialiser n'importe quel en-tête.

7 votes

Si vous avez accès à la configuration de votre serveur Web, vous pouvez y placer ces informations au lieu de les placer dans le fichier .htaccess. Il existe une idée fausse selon laquelle il faut mettre certaines choses dans le fichier .htaccess d'Apache et elle est alimentée par des réponses comme celles-ci. Vous n'avez pas besoin de .htaccess à moins que vous n'ayez pas un accès direct à la configuration du serveur web (par exemple, dans un environnement multi-vhost). Peut-être faut-il simplement écrire la configuration du serveur web OU le .htaccess. Voir danielmorell.com/guides/htaccess-seo/basics/

1 votes

Vous pouvez également ajouter que vous avez besoin de mod_headers (ou l'inclure dans un <IfModule).

35voto

angry_kiwi Points 1479

La page à http://www.askapache.com/htaccess/apache-speed-cache-control.html suggère d'utiliser quelque chose comme ça :

Ajouter les en-têtes Cache-Control

Cela va dans votre fichier racine .htaccess mais si vous avez accès à httpd.conf, c'est mieux.

Ce code utilise la directive FilesMatch et la directive Header pour ajouter des en-têtes Cache-Control à certains fichiers.

# 480 weeks
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>

3 votes

Est-ce que l'ordre est important ? "max-age=290304000, public" ou "public, max-age=290304000" ou les deux sont également corrects ?

2 votes

L'ordre n'a pas d'importance si les valeurs ne sont pas contradictoires (par exemple cache y no-cache ). max-age y public ne sont pas en conflit, donc l'ordre n'a pas d'importance.

2 votes

Notez que, puisqu'il utilise le Header vous devez activer la directive mod_headers .

16voto

Peter Štibraný Points 17507

Pour le serveur Apache, vous devez vérifier mod_expires pour définir les en-têtes Expires et Cache-Control.

Alternativement, vous pouvez utiliser En-tête pour ajouter Cache-Control vous-même :

Header set Cache-Control "max-age=290304000, public"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X