web-dev-qa-db-fra.com

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

J'ai un site php fonctionnant sur un serveur cloud. Quand 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 méta-code ci-dessus, je charge les mêmes fichiers mis en cache dans le navigateur au lieu d'un nouveau

102
ArrayOutOfBound

essaye ça

<?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");
?>
252
Codesen

Ici, si vous voulez le contrôler via 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 via 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');

AND Option 2 IS TOUJOURS MIEUX afin d'éviter tout problème de mise en cache basé sur le proxy.

30
Ritesh Aryal

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");

Espérons que cela aidera à prévenir le cache, le cas échéant!

10
Aakanksha

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

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

La solution:

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

Pour le developpement:

<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 si nécessaire)

Ou combinaison de ces deux:

<?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') : ""; ?>">

EDIT:

Ou combinaison plus jolie de ces deux:

<?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(); ?>">
6
Lukas

Empêcher le cache du navigateur n'est pas une bonne idée, selon le cas. À la recherche d'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 cas, 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 des actifs uniquement si son contenu est modifié:

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