Comment empêcher la mise en cache de fichiers http dans Apache httpd (MAMP)

139

Je développe une application Javascript d'une seule page dans MAMP. Mes fichiers de modèles JavaScript et HTML sont mis en cache entre les demandes.

Existe-t-il un moyen simple d'indiquer dans MAMP que je souhaite empêcher la mise en cache des fichiers http? Peut-être avec un .htaccessfichier? Où placer .htaccessou modifier l'hôte virtuel pour MAMP sur Mac?

dmck
la source

Réponses:

318

J'ai essayé ça? Si le travail à la fois .htaccess, httpd.confet dans un VirtualHost(généralement placé dans httpd-vhosts.confsi vous avez inclus à partir de votre httpd.conf)

<filesMatch "\.(html|htm|js|css)$">
  FileETag None
  <ifModule mod_headers.c>
     Header unset ETag
     Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
     Header set Pragma "no-cache"
     Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
  </ifModule>
</filesMatch>

100% empêchent les fichiers d'être mis en cache

Ceci est similaire à la façon dont les annonces Google utilisent l'en-tête Cache-Control: private, x-gzip-ok = ""> pour empêcher la mise en cache des annonces par les mandataires et les clients.

Depuis http://www.askapache.com/htaccess/using-http-headers-with-htaccess.html

Et éventuellement, ajoutez l'extension pour les fichiers modèles que vous récupérez si vous utilisez une extension autre que .htmlpour ceux-ci.

Charlie Rudenstål
la source
2
Merci, cela fonctionne très bien dans un fichier .htaccess. Je peux voir les options de contrôle du cache lorsque j'inspecte les en-têtes et que mes fichiers apparaissent avec http 200 au lieu de 304 entre les demandes, exactement ce dont j'avais besoin.
dmck
2
N'oubliez pas d'ajouter la commande LoadModule. LoadModule headers_module lib/modules/mod_headers.so
Spenhouet
Puis-je appliquer ces en-têtes à tous les types de fichiers, au lieu de définir les extensions une par une?
Thariq Nugrohotomo
1
@ThariqNugrohotomo Oui, c'est possible! C'est une expression régulière, vous pouvez essayer <filesMatch "\.+">ou<filesMatch ^>
Charlie Rudenstål
Je n'utilise pas MAMP mais Apache sur un serveur Web. Je devais également activer les en-têtes et expirer les modules sur mon installation Apache en tapant "sudo a2enmod headers" et "sudo a2enmod expires", puis sudo service apache2 restart. Les commandes / balises LoadModule et IfModule n'étaient pas nécessaires - omettez simplement les parties de balise IfModule entre crochets ci-dessus, mais entrez toujours les paramètres d'en-tête entre elles. -
andruo11
5

Basé sur l'exemple ici: http://drupal.org/node/550488

Ce qui suit fonctionnera probablement dans .htaccess

 <IfModule mod_expires.c>
   # Enable expirations.
   ExpiresActive On

   # Cache all files for 2 weeks after access (A).
   ExpiresDefault A1209600

  <FilesMatch (\.js|\.html)$>
     ExpiresActive Off
  </FilesMatch>
 </IfModule>
Frank Farmer
la source
Malheureusement, cela ne fonctionne pas lorsque je place un fichier .htaccess dans le répertoire de mon projet. Je ne sais pas si mod_expires est actif.
dmck
5
@dmck: supprimez la section <IfModule mod_expires.c>and </IfModule>.. si mod_expires n'est pas activé, vous obtiendrez une erreur au lieu que ces directives soient silencieusement ignorées.
Stennie
Dans un répertoire de projet, toute légère erreur de syntaxe ici peut provoquer une erreur 500.
SDsolar
3

J'ai eu le même problème, mais j'ai trouvé une bonne solution ici: arrêter la mise en cache pour PHP 5.5.3 dans MAMP

En gros, trouvez le fichier php.ini et commentez les lignes OPCache. J'espère que cette réponse alternative aidera également les autres.

acarito
la source
3
il s'agit de la mise en cache PHP côté serveur, alias OPCache. La question concerne les fichiers mis en cache par le navigateur qui sont demandés via HTTP.
Flion
2

Sans mod_expires, il sera plus difficile de définir des en-têtes d'expiration sur vos fichiers. Pour tout ce qui est généré, vous pouvez certainement définir des en-têtes par défaut sur la réponse, en faisant le travail de mod_expires comme ça:

<?php header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + 3600)); ?>

(extrait de: réponse Stack Overflow de @brianegge , où la solution mod_expires est également expliquée)

Maintenant, cela ne fonctionnera pas pour les fichiers statiques , comme vos fichiers javascript. Quant aux fichiers statiques, il n'y a qu'apache (sans aucun module d'expiration) entre le navigateur et le fichier source. Pour empêcher la mise en cache des fichiers javascript, ce qui se fait sur votre navigateur, vous pouvez utiliser un jeton aléatoire à la fin de l'url js, quelque chose comme ?rd=45642111, de sorte que l'URL ressemble à:

<script type="texte/javascript" src="my/url/myjs.js?rd=4221159546">

Si cette URL sur la page est générée par un fichier PHP, vous pouvez simplement ajouter la partie aléatoire avec PHP. Cette façon de randomiser l'url en ajoutant simplement des paramètres de chaîne de requête aléatoires est la base du paramètre no-cache de la requête ajax jQuery par exemple. Le navigateur ne considérera jamais que 2 URL ayant des chaînes de requête différentes sont identiques et n'utilisera jamais la version mise en cache.

ÉDITER

Notez que vous devez également tester les mod_headers . Si vous avez mod_headers, vous pouvez peut-être définir les en-têtes Expires directement avec le mot-clé Header .

regilero
la source
Merci, malheureusement, je n'utilise aucun fichier PHP. Je vais examiner mod_headers et installer mod_expires.
dmck
Qu'en est-il pour empêcher la mise en cache des fichiers CSS?
Aaron Franke
1
<FilesMatch "\.(js|css)$">
  ExpiresActive On
  ExpiresDefault A1
  Header append Cache-Control must-revalidate
</FilesMatch>
Bipin Bahuguna
la source
Ce n'est pas une réponse de bonne qualité. Essayez d'expliquer en détail quelles sont les étapes pour résoudre le problème signalé sur le PO.
leopal