Wie setze ich HTTP-Header (zur Cache-Kontrolle)?

236

Wie aktiviere ich das Browser-Caching für meine Site? Setze ich einfach Cache-Control: public irgendwo in meinem Header so ein?

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

Ich verwende die neueste Version von PHP, die auf der neuesten Version von XAMPP entwickelt wurde.

Andrew
quelle
Welche serverseitige Sprache verwenden Sie? PHP?, ASP?, JSP? Die Art und Weise, wie Sie die Header festlegen, ist ähnlich, aber nicht ganz gleich. Oder wenn Sie Bilder zwischenspeichern ... oft geschieht dies in Ihrer Apache- (oder Webserver-) Konfiguration
scunliffe
Leider generiert diese "Lösung" einfach einen ungültigen DOCTYPE ;-) Wenn Sie dies aus HTML tun möchten (ich würde es nicht empfehlen), würden Sie META HTTP-EQUIV

Antworten:

197

Um die Cache-Steuerung in HTML zu verwenden, verwenden Sie das Meta-Tag , z

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

Der Wert im Inhaltsfeld wird als einer der vier folgenden Werte definiert.

Einige Informationen zum Cache-ControlHeader lauten wie folgt

HTTP 1.1. Zulässige Werte = PUBLIC | PRIVAT | NO-CACHE | NO-STORE.

Öffentlich - Kann in öffentlichen freigegebenen Caches zwischengespeichert werden.
Privat - darf nur im privaten Cache zwischengespeichert werden.
No-Cache - darf nicht zwischengespeichert werden.
No-Store - kann zwischengespeichert, aber nicht archiviert werden.

Die Direktive CACHE-CONTROL: NO-CACHE gibt an, dass zwischengespeicherte Informationen nicht verwendet werden sollten und stattdessen Anforderungen an den Ursprungsserver weitergeleitet werden sollten. Diese Direktive hat die gleiche Semantik wie die PRAGMA: NO-CACHE.

Kunden SOLLEN sowohl PRAGMA umfassen: no-cache und Cache-Control: no-cache wenn eine no-cache - Anforderung an einen Server nicht bekannt gesendet wird HTTP / 1.1 - kompatibel zu sein. Siehe auch ABLAUF.

Hinweis: Es ist möglicherweise besser, Cache-Befehle in HTTP anzugeben als in META-Anweisungen, bei denen sie mehr als den Browser beeinflussen können, aber Proxys und andere Vermittler, die Informationen zwischenspeichern können.

Codemwnci
quelle
30
HTML5 verbietet dies und war <meta>schon immer eine schreckliche und flockige Methode, um das Caching festzulegen.
Kornel
1
@porneL Ich habe Probleme zu verstehen, welcher Teil Ihrer Links welchen Teil der Antwort verbietet ... Die Meta-Tag-Spezifikationen sagen nichts darüber aus, was hier geschrieben steht oder was nicht?
Félix Gagnon-Grenier
1
@ FélixGagnon-Grenier "Das http-equiv-Attribut ist ein Aufzählungsattribut" bedeutet, dass nur Werte in der Tabelle in der Spezifikation zulässig sind. Im späteren Abschnitt ("andere Pragma-Direktiven") wird sogar das Caching aufgerufen:> Pragma-Direktiven, die Headern entsprechen, die sich auf das HTTP-Verarbeitungsmodell auswirken (z. B. Caching), dürfen nicht registriert werden, da dies zu einem anderen Verhalten auf HTTP-Ebene führen würde Benutzeragenten, die HTML implementieren, als Benutzeragenten, die dies nicht tun.
Kornel
3
Das zitierte Dokument ist in Bezug auf den no-storeWert nicht korrekt (obwohl das Dokument selbst auf RFC 2068 verweist ) - no-storeverhindert, dass das Dokument überhaupt irgendwo gespeichert / zwischengespeichert wird. Zwar kann no-cachees gespeichert werden, es muss jedoch jedes Mal beim Server nachgefragt werden. Browser neigen dazu, no-cacheSeiten zu speichern , um die Funktion der Zurück-Schaltfläche usw. zu aktivieren .
MrWhite
3
Google bietet eine der einfachsten Referenzen für das HTTP-Caching IMO: developer.google.com/web/fundamentals/performance/…
MrWhite
136

Sie können die Header in PHP festlegen, indem Sie Folgendes verwenden:

<?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)

?>

Beachten Sie, dass die genauen verwendeten Header von Ihren Anforderungen abhängen (und ob Sie HTTP 1.0 und / oder HTTP 1.1 unterstützen müssen ).

scunliffe
quelle
3
Pragmaund Expiressind wahrscheinlich für die überwiegende Mehrheit der Browser redundant. fastly.com/blog/headers-we-dont-want
thijsai
1
@thijsai yeah HTTP / 1.0 ist auch massiv veraltet ... benutze nur die Header, die du basierend auf deiner Benutzermatrix
brauchst
48

Wie ich geschrieben habe, ist es am besten, die Datei zu verwenden .htaccess. Achten Sie jedoch darauf, wann Sie den Inhalt im Cache belassen.

Verwenden:

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

Wobei: 604800 = 7 Tage

PS: Hiermit können Sie jeden Header zurücksetzen

Wilhelm
quelle
29

Auf der Seite unter http://www.askapache.com/htaccess/apache-speed-cache-control.html wird folgende Verwendung vorgeschlagen:

Fügen Sie Cache-Control-Header hinzu

Dies geht in Ihre .htaccess-Stammdatei, aber wenn Sie Zugriff auf httpd.conf haben, ist das besser.

Dieser Code verwendet die FilesMatch-Direktive und die Header-Direktive, um bestimmten Dateien Cache-Control-Header hinzuzufügen.

# 480 weeks
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>
wütende Kiwi
quelle
3
Ist Ordnung in diesem Bereich wichtig? "max-age = 290304000, public" Oder "public, max-age = 290304000" oder beide sind gleich richtig?
Satya Prakash
2
Die Reihenfolge spielt keine Rolle, wenn die Werte nicht in Konflikt stehen (wie cacheund no-cache). max-ageund publicnicht in Konflikt stehen, damit die Reihenfolge keine Rolle spielt.
Blaise
1
Beachten Sie, dass HeaderSie aktivieren müssen , da die Direktive verwendet wird mod_headers.
Skippy le Grand Gourou
@Skippy le Grand Gourou Wie aktiviere ich mod_headers?
Sam
@SamuelStratford Ich habe gelesen, dass es bei anderen Distributionen anders ist, aber unter Debian können Sie entweder a2enmodeinen symbolischen Link von /etc/apache2/mods-available/headers.loadzu verwenden oder einen symbolischen Link von zu erstellen /etc/apache2/mods-enabled/headers.load.
Skippy le Grand Gourou
20

Dies ist das Beste, was .htaccessich auf meiner aktuellen Website verwendet habe:

<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

##Tweaks##
Header set X-Frame-Options SAMEORIGIN

## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
## EXPIRES CACHING ##

<IfModule mod_headers.c>
    Header set Connection keep-alive
    <filesmatch "\.(ico|flv|gif|swf|eot|woff|otf|ttf|svg)$">
        Header set Cache-Control "max-age=2592000, public"
    </filesmatch>
    <filesmatch "\.(jpg|jpeg|png)$">
        Header set Cache-Control "max-age=1209600, public"
    </filesmatch>
    # css and js should use private for proxy caching https://developers.google.com/speed/docs/best-practices/caching#LeverageProxyCaching
    <filesmatch "\.(css)$">
        Header set Cache-Control "max-age=31536000, private"
    </filesmatch>
    <filesmatch "\.(js)$">
        Header set Cache-Control "max-age=1209600, private"
    </filesmatch>
    <filesMatch "\.(x?html?|php)$">
        Header set Cache-Control "max-age=600, private, must-revalidate"
      </filesMatch>
</IfModule>
Erich García
quelle
3
Fast perfektes Beispiel für eine .htaccess-Datei ... Es wäre vollständig, wenn bestimmte Bilder enthalten wären und wie der Pfad zum Bild geschrieben wird UND wo die .htaccess-Datei abgelegt werden soll (z. B. im Bildverzeichnis oder im Indexverzeichnis). .z.B. '<IfModule mod_headers.c> <Files /img/myimage.jpg> Header anhängen Cache-Control "max-age = 3600, muss erneut validiert werden" </ Files> </ IfModule>' ... würde das funktionieren? .. . ODER ... oder eingefügt in img dir '<filesmatch "^ (Beispiel \ .jpg | sample \ .png) $"> Header-Set Cache-Control "max-age = 31536000, public" </ filesmatch>' .. an. alle gleich scheint Strategie riskant - ohnehin spezielle Beispiele wäre toll , wenn mögl
Marco-UandL
2
Nur zu Ihrer Information: Die GZIP-Komprimierung von JS- und CSS-Dateien kann dazu beitragen, Ihre SSL-Verschlüsselung zu unterbrechen. Wenn Sie sich auf Sicherheit verlassen, schalten Sie gzip nicht ein
Eduard Void
1
Dadurch wird die Seite des Anmeldekontos zwischengespeichert, sodass Sie sich nicht von Ihrem Konto abmelden können. Schlimmer noch, jemand kann nicht einfach auf die Kontoseite zugreifen und sich mit dem Login des letzten Benutzers anmelden. Es ist nicht ratsam, auf einer E-Commerce-Website zu verwenden. Entfernen Sie dann die <filesMatch "\.(x?html?|php)$">, um zu vermeiden, dass statische HTML-Seiten zwischengespeichert werden. Der Rest der Dateimatches ist in Ordnung.
NicoX
1
Sie haben dupliziert <filesmatch "\.(eot|woff|otf|ttf|svg)$">.
NicoX
2
Sie setzen cssund jsauf privat, wenn Sie Proxy-Caching haben. Ich konnte in Ihrem Link keine Empfehlungen dazu finden. Die meisten CDNs empfehlen, diese Werte zwischenzuspeichern.
NicoX
13

Für Apache-Server sollten Sie mod_expires überprüfen, um Expires- und Cache-Control-Header festzulegen.

Alternativ können Sie die Header- Direktive verwenden, um Cache-Control selbst hinzuzufügen:

Header set Cache-Control "max-age=290304000, public"
Peter Štibraný
quelle
5

Mit dem Meta-Cache-Steuerungs-Tag können Web-Publisher festlegen, wie Seiten von Caches behandelt werden sollen. Dazu gehören Anweisungen zum Deklarieren, was zwischengespeichert werden soll, was von Caches gespeichert werden kann, Änderungen des Ablaufmechanismus sowie Steuerelemente zum erneuten Validieren und Neuladen.

Die zulässigen Werte sind:

Öffentlich - kann in öffentlichen freigegebenen Caches zwischengespeichert werden
Privat - darf nur im privaten Cache zwischengespeichert werden
no-Cache - darf nicht zwischengespeichert werden
no-Store - darf zwischengespeichert, aber nicht archiviert werden

Bitte achten Sie auf die Groß- und Kleinschreibung. Fügen Sie das folgende Meta-Tag in die Quelle Ihrer Webseite ein. Der Unterschied in der Schreibweise am Ende des Tags besteht darin, dass Sie entweder "/> = xml oder"> = html verwenden.

    <meta http-equiv="Cache-control" content="public">
    <meta http-equiv="Cache-control" content="private">
    <meta http-equiv="Cache-control" content="no-cache">
    <meta http-equiv="Cache-control" content="no-store">

Quelle-> MetaTags

Karthik NG
quelle
Korrektur: no-store sollte nicht zwischengespeichert wird, wird kein Cache erlaubt zwischengespeichert werden , aber mit dem Server überprüft werden muß , bevor sie reserviert - siehe palizine.plynt.com/issues/2008Jul/cache-control-attributes
danger
Cache-Control no-store - no-store ähnelt no-cache darin, dass die Antwort nicht zwischengespeichert und wiederverwendet werden kann, es gibt jedoch einen wichtigen Unterschied. Für no-store muss die Ressource jedes Mal angefordert und vom Ursprungsserver heruntergeladen werden. Dies ist eine wichtige Funktion beim Umgang mit privaten Informationen.
MarcoZen
5

OWASP empfiehlt Folgendes:

Stellen Sie nach Möglichkeit sicher, dass der HTTP-Header für die Cache-Steuerung auf no-cache, no-store, must-revalidate, private gesetzt ist. und dass der Pragma-HTTP-Header ohne Cache gesetzt ist.

<IfModule mod_headers.c>
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
</IfModule>
Jun Bae gewonnen
quelle