146 votes

Comment empêcher le cache du navigateur pour un site php

Lorsque j'ajoute de nouveaux fichiers css, js ou images, le navigateur charge les mêmes anciens fichiers js, css et images stockés dans le cache.

Mon site a un doctype et une balise méta comme ci-dessous

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

  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <meta http-equiv="Page-Enter" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Page-Exit" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Site-Enter" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Site-Exit" content="blendTrans(Duration=1.0)">

En raison du doctype et du meta code ci-dessus, est-ce que je charge les mêmes fichiers mis en cache dans le navigateur au lieu du nouveau fichier ?

341voto

Codesen Points 1069

Essayez ceci

<?php

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>

44voto

Ritesh Aryal Points 27

Ici, si vous voulez le contrôler par HTML : faites comme ci-dessous Option 1 :

<meta http-equiv="expires" content="Sun, 01 Jan 2014 00:00:00 GMT"/>
<meta http-equiv="pragma" content="no-cache" />

Et si vous voulez le contrôler par PHP : faites-le comme ci-dessous Option 2 :

header('Expires: Sun, 01 Jan 2014 00:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');

ET Option 2 EST TOUJOURS MEILLEUR afin d'éviter les problèmes de mise en cache par proxy.

13voto

Aakanksha Points 119

Vous pouvez essayer ceci :

    header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    header("Connection: close");

J'espère que cela aidera à prévenir les caches, s'il y en a !

10voto

Lukas Points 767

J'ai eu un problème avec la mise en cache de mes fichiers css. La définition des en-têtes en PHP ne m'a pas aidé (peut-être parce que les en-têtes devraient être définis dans le fichier de la feuille de style au lieu de la page qui y est liée ?)

J'ai trouvé la solution sur cette page : https://css-tricks.com/can-we-prevent-css-caching/

La solution :

Ajouter l'horodatage comme partie de la requête de l'URI pour le fichier lié.
(Peut être utilisé pour css, js, images etc.)

Pour le développement :

<link rel="stylesheet" href="style.css?<?php echo date('Y-m-d_H:i:s'); ?>">

Pour la production (où la mise en cache est généralement une bonne chose) :

<link rel="stylesheet" type="text/css" href="style.css?version=3.2">
(et réécrire manuellement quand c'est nécessaire)

Ou une combinaison de ces deux éléments :

<?php
    define( "DEBUGGING", true ); // or false in production enviroment
?>
<!-- ... -->
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo (DEBUGGING) ? date('_Y-m-d_H:i:s') : ""; ?>">

EDITAR:

Ou une plus jolie combinaison de ces deux-là :

<?php
    // Init
    define( "DEBUGGING", true ); // or false in production enviroment
    // Functions
    function get_cache_prevent_string( $always = false ) {
        return (DEBUGGING || $always) ? date('_Y-m-d_H:i:s') : "";
    }
?>
<!-- ... -->
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo get_cache_prevent_string(); ?>">

6voto

ismavolk Points 105

Empêcher le cache du navigateur n'est pas une bonne idée selon les cas. En cherchant une solution, j'ai trouvé des solutions comme celle-ci :

<link rel="stylesheet" type="text/css" href="meu.css?v=<?=filemtime($file);?>">

le problème ici est que si le fichier est écrasé lors d'une mise à jour sur le serveur, ce qui est mon scénario, le cache est ignoré car l'horodatage est modifié même si le contenu du fichier est le même.

J'utilise cette solution pour forcer le navigateur à télécharger les actifs uniquement si leur contenu est modifié :

<link rel="stylesheet" type="text/css" href="meu.css?v=<?=hash_file('md5', $file);?>">

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