So verhindern Sie das Zwischenspeichern von http-Dateien in Apache httpd (MAMP)

139

Ich entwickle eine einseitige Javascript-Anwendung in MAMP. Meine JavaScript- und HTML-Vorlagendateien werden zwischen Anforderungen zwischengespeichert.

Gibt es eine einfache Möglichkeit, in MAMP anzuzeigen, dass ich das Zwischenspeichern von HTTP-Dateien verhindern möchte? Möglicherweise mit einer .htaccessDatei? Wo platziere ich .htaccessden virtuellen Host für MAMP oder ändere ihn auf dem Mac?

dmck
quelle

Antworten:

318

Versucht das? Sollte in beiden arbeitet .htaccess, httpd.confund in einem VirtualHost( in der Regel platziert httpd-vhosts.confwenn Sie es eingeschlossen von Ihrem 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% Verhindern, dass Dateien zwischengespeichert werden

Dies ähnelt der Verwendung des Headers Cache-Control in Google-Anzeigen: private, x-gzip-ok = "">, um das Zwischenspeichern von Anzeigen durch Proxys und Clients zu verhindern.

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

Fügen Sie optional die Erweiterung für die Abrufdateien hinzu, die Sie abrufen, wenn Sie eine andere Erweiterung als .htmldiese verwenden.

Charlie Rudenstål
quelle
2
Vielen Dank, dies funktioniert sehr gut in einer .htaccess-Datei. Ich kann die Cache-Steuerungsoptionen sehen, wenn ich die Header überprüfe und meine Dateien zwischen den Anforderungen mit http 200 statt 304 angezeigt werden, genau das, was ich brauchte.
dmck
2
Vergessen Sie nicht, den Befehl LoadModule hinzuzufügen. LoadModule headers_module lib/modules/mod_headers.so
Spenhouet
Kann ich diesen Header auf alle Dateitypen anwenden, anstatt die Erweiterungen einzeln zu definieren?
Thariq Nugrohotomo
1
@ ThariqNugrohotomo Ja, das ist möglich! Es ist ein regulärer Ausdruck, Sie können versuchen <filesMatch "\.+">oder<filesMatch ^>
Charlie Rudenstål
Ich verwende nicht MAMP, sondern Apache auf einem Webserver. Ich musste auch Header aktivieren und Module in meiner Apache-Installation ablaufen lassen, indem ich "sudo a2enmod headers" und "sudo a2enmod expires" eingab und dann den sudo service apache2 neu startete. Die Befehle / Tags LoadModule und IfModule waren nicht erforderlich. Lassen Sie einfach die oben stehenden IfModule-Tag-Teile in Klammern weg, und geben Sie trotzdem die Header-Einstellungen zwischen ihnen ein. -
andruo11
5

Basierend auf dem Beispiel hier: http://drupal.org/node/550488

Das Folgende wird wahrscheinlich in .htaccess funktionieren

 <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
quelle
Leider funktioniert dies nicht, wenn ich eine .htaccess-Datei in mein Projektverzeichnis lege. Ich bin nicht sicher, ob mod_expires aktiv ist.
dmck
5
@dmck: entferne den Abschnitt <IfModule mod_expires.c>und </IfModule>. Wenn mod_expires nicht aktiviert ist, wird ein Fehler angezeigt, anstatt dass diese Anweisungen stillschweigend ignoriert werden.
Stennie
In einem Projektverzeichnis kann jeder geringfügige Syntaxfehler hier einen 500-Fehler verursachen.
SDsolar
3

Ich hatte das gleiche Problem, aber ich habe hier eine gute Lösung gefunden: Stoppen Sie das Caching für PHP 5.5.3 in MAMP

Suchen Sie im Grunde die Datei php.ini und kommentieren Sie die OPCache-Zeilen aus. Ich hoffe, diese alternative Antwort hilft auch anderen.

Acarito
quelle
3
Hier geht es um PHP-Caching auf der Serverseite, auch bekannt als OPCache. Die Frage betrifft Dateien, die vom Browser zwischengespeichert werden und über HTTP angefordert werden.
Flion
2

Ohne mod_expires ist es schwieriger, Ablaufheader für Ihre Dateien festzulegen . Für alles, was generiert wird, können Sie sicherlich einige Standardheader für die Antwort festlegen, indem Sie die Aufgabe von mod_expires folgendermaßen ausführen:

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

(entnommen aus: Stack Overflow-Antwort von @brianegge , wo auch die mod_expires-Lösung erklärt wird)

Dies funktioniert jetzt nicht mehr für statische Dateien wie Ihre Javascript-Dateien. Bei statischen Dateien befindet sich nur Apache (ohne Ablaufmodul) zwischen dem Browser und der Quelldatei. Um das Zwischenspeichern von Javascript-Dateien zu verhindern, das in Ihrem Browser ausgeführt wird, können Sie ein zufälliges Token am Ende der js-URL verwenden. ?rd=45642111Die URL sieht also folgendermaßen aus:

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

Wenn diese URL auf der Seite von einer PHP-Datei generiert wird, können Sie einfach den zufälligen Teil mit PHP hinzufügen. Diese Art der Randomisierung von URLs durch einfaches Anhängen von Parametern für zufällige Abfragezeichenfolgen ist beispielsweise die Grundvoraussetzung für die Einstellung ohne Cache bei einer Ajax-jQuery-Anforderung. Der Browser betrachtet niemals 2 URLs mit unterschiedlichen Abfragezeichenfolgen als gleich und verwendet niemals die zwischengespeicherte Version.

BEARBEITEN

Beachten Sie, dass Sie auch mod_headers testen sollten . Wenn Sie mod_headers haben, können Sie die Expires-Header möglicherweise direkt mit dem Schlüsselwort Header festlegen .

Regilero
quelle
Danke, leider benutze ich keine PHP-Dateien. Ich werde mich mit mod_headers befassen und mod_expires installieren.
dmck
Was ist, um das Zwischenspeichern von CSS-Dateien zu verhindern?
Aaron Franke
1
<FilesMatch "\.(js|css)$">
  ExpiresActive On
  ExpiresDefault A1
  Header append Cache-Control must-revalidate
</FilesMatch>
Bipin Bahuguna
quelle
Das ist keine gute Antwort. Versuchen Sie im Detail zu erklären, welche Schritte zur Lösung des im OP gemeldeten Problems erforderlich sind.
Leopal