- Anthony Heddings
- July 29, 2020, 11:00am EDT
Jeder Browser eines Benutzers nutzt einen eingebauten Cache, um heruntergeladene Objekte zu speichern, was wiederholte Besuche Ihrer Website erheblich beschleunigen kann, da sie von der Festplatte und nicht über das Netzwerk geladen werden. Hier erfahren Sie, wie Sie den Cache im Apache konfigurieren können.
Wie funktioniert Caching?
Beim ersten Aufruf Ihrer Website lädt der Benutzer alle statischen Ressourcen herunter, die für die Darstellung der Seite erforderlich sind, z. B. Ihr Logo. Wenn sie zu einer neuen Seite navigieren, wird Ihr Logo aus dem Speicher geladen, anstatt es erneut abzufragen, was die Leistung erheblich beschleunigt und die Belastung Ihres Webservers verringert.
Dies ist ein clientseitiger Cache, aber viele Websites nutzen auch ein Content Delivery Network (CDN). Ein CDN ist ein Netzwerk von Servern, die vor Ihrem Haupt-Webserver oder „Ursprungsserver“ stehen. Dieses Netzwerk speichert Ihre Seiten im Zwischenspeicher, wodurch die maximale Bandbreite erhöht, die Zugriffslatenz verringert und die Belastung Ihres Ursprungs-Servers stark reduziert wird. Wenn Sie mehr über CDNs erfahren möchten, können Sie hier unseren Leitfaden dazu lesen.
Cache-Control
ist ein Header, den Sie Ihren Webserver so konfigurieren können, dass er zu allen ausgehenden Anfragen hinzugefügt wird und der dem Browser und den CDNs mitteilt, wie Ihr Inhalt zwischengespeichert werden soll.
Bestimmte Seiten sollten niemals von gemeinsam genutzten Caches wie CDNs zwischengespeichert werden. Andernfalls besteht die Gefahr, dass die persönlichen Daten eines Nutzers für andere sichtbar werden. Als allgemeine Regel gilt: Wenn die Seite für alle Benutzer gleich ist, wie z. B. Ihre Homepage, können Sie sie im Cache speichern. Wenn sie vertrauliche Benutzerinformationen enthält, sollten Sie sie aus dem Cache verbannen. Statische Ressourcen, wie CSS und Bilder, können in der Regel für alle Benutzer zwischengespeichert werden, oft sogar viel länger.
Die Zeit, die ein Objekt im Cache verbringt, ist ebenfalls wichtig. Das maximale Alter der zwischengespeicherten Ressourcen wird als Time-To-Live (TTL) bezeichnet und bestimmt, wie lange das Objekt im Cache verbleibt, bevor es für ungültig erklärt wird und der Benutzer aufgefordert wird, ein neues Objekt anzufordern. Für statische Ressourcen, die sich nicht oft ändern, können Sie sehr hohe TTL-Werte festlegen, in der Regel etwa zwei Jahre. Für Dinge, die Sie möglicherweise aktualisieren möchten, sollten Sie niedrigere TTL-Werte festlegen, um zu verhindern, dass veraltete Ressourcen zu lange im Cache verbleiben.
Sie können immer versionierte Dateinamen verwenden, um ein Neuladen des Caches auszulösen. Wenn Sie eine neue Version eines CSS-Stylesheets veröffentlichen, können Sie es styles-1.0.1.css
nennen, und der Browser des Benutzers (und alle CDNs davor) werden es als eine neue Datei ansehen, die erneut heruntergeladen werden muss. Zusätzlich können Sie bei einigen CDNs manuelle Invalidierungen durchführen, um den bestehenden Cache zu leeren, ohne Dateinamen zu ändern.
Wie man Cache-Control im Apache verwendet
Cache-Control
hat einige Optionen:
-
public
– Kann von jedem gecached werden, einschließlich Browsern und CDNs. Verwenden Sie dies für die meisten statischen Objekte. -
private
– Enthält sensible Daten, die nicht von CDNs oder Reverse Proxies zwischengespeichert werden können. Der Browser des Benutzers kann sie lokal zwischenspeichern. Verwenden Sie dies für die meisten authentifizierten Seiten. -
no-cache
– Trotz des Namens wird das Caching nicht deaktiviert. Der Browser kann die Antwort aus Leistungsgründen immer noch zwischenspeichern, muss aber vor der Verwendung beim Ursprungsserver nach Aktualisierungen suchen. Verwenden Sie diese Option, wenn Sie möchten, dass der Benutzer jedes Mal eine erneute Überprüfung vornimmt. -
no-store
– Deaktiviert das Caching vollständig. Verwenden Sie dies nur für hochsensible Daten, die nicht zweimal gesendet werden sollten.
Zusätzlich können Sie die Direktive no-transform
hinzufügen, die alle Konvertierungen deaktiviert, die an der Ressource vorgenommen werden können. Einige CDNs komprimieren zum Beispiel Bilder, um die Bandbreite zu verringern. Diese Direktive deaktiviert dieses Verhalten.
Im Apache müssen Sie diesen Header manuell mit der Header set
-Direktive setzen, etwa so:
Header set Cache-Control "max-age=84600, public"
Der max-age
-Wert wird in Sekunden gesetzt, zum Beispiel max-age=300
für eine fünfminütige TTL und max-age=63072000
für zwei Jahre.
Sie können diese Direktive in das Stammverzeichnis Ihrer Konfiguration setzen, um sie standortweit anzuwenden, aber eine bessere Methode ist es, die Einstellungen je nach Dateityp anzuwenden. Wenn Sie beispielsweise eine hohe TTL für die meisten statischen Medien festlegen möchten, können Sie einen FilesMatch
-Block verwenden:
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"> Header set Cache-Control "max-age=63072000, public" </FilesMatch>
Wenn Sie einen bestimmten Pfad auf eine schwarze Liste setzen möchten, damit er nicht von CDNs zwischengespeichert wird, können Sie einen Directory
-Block verwenden:
<Directory "/private"> Header set Cache-Control "max-age=300, private" </Directory>
Oder passen Sie einfach eine einzelne Datei an:
<File "protected.html"> Header set Cache-Control "max-age=300, private" </File>
Die Blöcke mit den spezifischeren Übereinstimmungen haben Vorrang vor den allgemeinen Regex-Übereinstimmungen, aber Sie sollten überprüfen, ob alles auf der Empfängerseite richtig eingestellt ist. Sie können dies in den DevTools von Chrome unter „Network > Headers“ überprüfen.
Wenn Sie nur Zugriff auf die .htaccess
-Konfiguration haben, können Sie trotzdem den Verzeichnisabgleich verwenden, indem Sie eine neue .htaccess
-Datei in jedem Unterverzeichnis erstellen.
Verwenden Sie Surrogate-Control, um das CDN-Verhalten direkt zu ändern
Der Surrogate-Control
-Header funktioniert genau wie Cache-Control
, enthält aber spezifische Anweisungen für CDNs und Reverse-Proxies und nicht für Endbenutzer. Auf diese Weise können Sie CDNs anweisen, eine Sache zu tun, aber unterschiedliche Richtungen an den Browser zu senden.
Sie müssen diesen Header manuell setzen, auf die gleiche Weise wie Cache-Control
:
Header set Surrogate-Control "max-age=300, public"
Sie sollten auf jeden Fall mit Ihrem CDN testen, um zu überprüfen, ob dies funktioniert – Surrogate-Control
ist ziemlich neu und nicht universell.
Anthony Heddings ist der ortsansässige Cloud-Ingenieur für LifeSavvy Media, ein technischer Autor, Programmierer und ein Experte für Amazons AWS-Plattform. Er hat Hunderte von Artikeln für How-To Geek und CloudSavvy IT geschrieben, die millionenfach gelesen wurden.Read Full Bio “