Ich habe einen Browser-Cache für eine statische Site über die Datei .htaccess
eingerichtet, indem Sie Folgendes festgelegt:
# BROWER CACHING - 1 Day for images
<filesMatch ".(jpg|jpeg|gif|ico)$">
Header set Cache-Control "max-age=86400, public"
</filesMatch>
Es ist gut, wenn diese Bilder einen Cache für einen Tag haben, aber die Site ändert sich häufig und daher möchte ich die CSS- und JS-Dateien nicht zwischenspeichern.
Ich habe etwas über ETag gelesen, mit dem Sie, wie ich es verstehe, eine Datei zwischenspeichern, aber auch das Erstellungsdatum festlegen kann. Wenn sie also beim nächsten Besuch eines Clients aktualisiert wird, wird geprüft, ob das Erstellungsdatum übereinstimmt.
Sie würden entweder FileETag MTime Size
oder Header unset Etag
und FileEtag none
verwenden. Verwenden Sie nicht beide (ETag erstellen und ETag entfernen) und wählen Sie nur denjenigen aus, der auf Ihrem Server am besten geeignet ist.
# Create the ETag (entity tag) response header field
FileETag MTime Size
oder
# Remove the ETag (entity tag) response header field
Header unset ETag
FileETag none
Die ETAG ist nicht das wichtigste Attribut. Das Hauptattribut, das Sie vermissen, ist verfallen. Ich bin zu 100% sicher, dass der Browser-Cache ohne etag funktioniert. Überprüfen Sie die folgende Konfiguration unter http://pisrs.si . Wie zu überprüfen? Klicken Sie im Browser auf F12, gehen Sie zur Registerkarte "Netzwerk", sehen Sie, wie Ressourcen abgerufen werden, und vergleichen Sie sie mit Ihrer Website. Localhost-Ressourcen werden auf unterschiedliche Weise zwischengespeichert. Überprüfen Sie dazu Ihre Browser-Informationen.
Unten ist die Konfiguration der Hauptdomäne, die funktioniert. Stellen Sie sicher, dass Sie die erforderlichen Mods aktiviert haben.
<IfModule mod_mime.c>
AddType text/css .css
AddType application/x-javascript .js
AddType image/bmp .bmp
AddType image/gif .gif
AddType application/x-gzip .gz .gzip
AddType image/x-icon .ico
AddType image/jpeg .jpg .jpeg .jpe
AddType image/png .png
AddType application/x-font-ttf .ttf .ttc
AddType application/Zip .Zip
</IfModule>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css A31536000
ExpiresByType application/x-javascript A31536000
ExpiresByType application/javascript A31536000
ExpiresByType text/javascript A31536000
ExpiresByType text/x-js A31536000
ExpiresByType image/bmp A31536000
ExpiresByType image/gif A31536000
ExpiresByType application/x-gzip A31536000
ExpiresByType image/x-icon A31536000
ExpiresByType image/jpeg A31536000
ExpiresByType application/x-font-otf A31536000
ExpiresByType image/png A31536000
ExpiresByType application/x-font-ttf A31536000
ExpiresByType application/Zip A31536000
</IfModule>
<IfModule mod_deflate.c>
<IfModule mod_headers.c>
Header append Vary User-Agent env=!dont-vary
</IfModule>
AddOutputFilterByType DEFLATE text/html text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/plain image/x-icon image/png image/gif
<IfModule mod_mime.c>
# DEFLATE by extension
AddOutputFilter DEFLATE js css htm html xml png gif
</IfModule>
</IfModule>
<FilesMatch "\.(gif|ico|jpg|jpeg|png|GIF|ICO|JPG|JPEG|PNG|css|js|woff|CSS|JS|WOFF|ttf|TTF)$">
<IfModule mod_headers.c>
Header unset Set-Cookie
Header set Cache-Control "max-age=31536000, public"
</IfModule>
</FilesMatch>
ETags sind nur ein eindeutiges undurchsichtiges Tag. Sie können sie nur mit Ausnahme der Gleichheit vergleichen. Wenn Sie also 2 ETags für dieselbe Ressource (z. B. URI) haben, können Sie nicht feststellen, welche Ressource neuer ist. Dafür benötigen Sie den Last-Modified-Header.
Sogar der Last-Modified-Header ist problematisch, da er nur eine Auflösung von 1s hat. Auf stark modifizierten Websites (wie z. B. bei Blogs) ist es durchaus möglich, dass ein Cache mehrere Repräsentationen einer Datei mit unterschiedlichen ETags und denselben Last-Mods hat. Modifizierter Wert Es ist eine Schande, dass sie es nicht für angebracht hielten, ETags monoton zu erhöhen, damit sie verglichen werden konnten.
ETag wird in bedingten Anforderungen mit dem Header If-None-Match für GETs und If-Match für PUT verwendet. In diesem Fall sollte der Server den vollständigen Text nur zurückgeben, wenn keines der gelieferten ETag (s) mit dem aktuellen ETag übereinstimmt für die Ressource (sie hat sich geändert) und im zweiten Fall (für PUT oder PATCH) nur, wenn sie übereinstimmt, sodass Sie an der richtigen Version arbeiten.
Sowohl ETag als auch Last-Modified sind jedoch Cache Validator Header. Der größte Vorteil des Caching betrifft das Konzept Frische . Mit Validatoren können Sie überprüfen, ob Ihre Version noch gültig ist. Dies erfordert jedoch immer eine Anforderung an den Server. Alles, was Sie sparen können, ist die Übertragung der Nutzlast. Für viele Dinge lohnt es sich heutzutage einfach nicht.
Frische hingegen (Expires-Header oder Max-Age-Cache-Control-Direktive) ermöglicht es dem Client, eine erneute Validierung zu vermeiden, wenn die bereits vorhandene Version noch nicht abgeschlossen ist. Dies erspart das Überprüfen der Verbindung zum Server und kann daher beim Laden von Seiten viel Zeit sparen.
HTTP hat mehrere Funktionen im Zusammenhang mit Caching und sie gelten sowohl für den Cache des Benutzeragenten (Browser) als auch für den Proxy-Cache (transparent oder nicht transparent), z Server). Diese Funktionen werden in zwei Gruppen eingeteilt: Ablauf (kann die Anforderung vollständig verhindern) und Validierung (kann die Übertragung von Daten verhindern).
Entity tag (ETag
) ist nur eine dieser Funktionen und gehört zur Validierungsgruppe. Die andere in dieser Gruppe ist die letzte Änderungszeit (Last-Modified
). Entity-Tag ermöglicht die Ungültigmachung des Caches aufgrund von Inhaltsänderungen anstelle der letzten Änderung. Lesen Sie mehr über wie Entity-Tag funktioniert on Wikipedia. Kurz gesagt, die typische Verwendung ist:
Der Server fügt einer Antwort mit einer bereitgestellten Ressource den Header ETag
hinzu.
Der Client speichert die Ressource im Cache und merkt sich das Entity-Tag (den Wert von ETag
).
Wenn der Client das nächste Mal die Ressource benötigt, fordert er sie vom Server an bedingt. In der Anfrage ist der Header If-None-Match
Enthalten, der das Entity-Tag enthält.
Wenn sich die Ressource geändert hat (das Entity-Tag in If-None-Match
Wird vom Server als veraltet angesehen), sendet der Server eine Antwort mit der aktuellen Version der Ressource (und dem neuen Entity-Tag), andernfalls antwortet er nur mit 304 Not Modified
Und macht sich nicht die Mühe, die Ressource erneut zu senden.
Für statische Dateien (die nicht dynamisch von einem CGI-Skript oder so bei jeder Anforderung erstellt wurden) kann Apache so konfiguriert werden, dass ETag
über FileETag
Direktive . Standardmäßig generiert Apache, ohne dass Sie Änderungen an der Konfiguration vornehmen, ETag
und sein Wert basieren auf der letzten Änderungszeit (mtime) und der Größe der Datei in Apache 2.4. In Apache 2.3.14 wird standardmäßig auch die Inode-Nummer der Datei verwendet.
Wenn die Datei dynamisch bereitgestellt wird, kann Apache die ETag
nicht generieren, da es nicht weiß, wie die zwischenzuspeichernde Ressource generiert wird. Es ist Aufgabe des Skripts, ETag
entsprechend einzustellen und mit If-None-Match
Umzugehen. Z.B. In mod_Perl kann der Teil If-None-Match
mit Apache2 :: Request :: meets_conditions behandelt werden, wodurch die Behandlung von HTTP/1.1-bedingten Anforderungen im Allgemeinen implementiert wird.
Wenn Sie sich ausschließlich auf ETag verlassen möchten , müssen Sie andere Validierungsfunktionen und den Ablaufmechanismus deaktivieren. Stellen Sie Cache-Control: max-age=0, must-revalidate
Und Expires: 0
Ein, um die erneute Validierung von Cache-Einträgen zu erzwingen (d. H. Immer eine Anfrage stellen). Sie können auch den Last-Modified
- Header aus den Antworten entfernen, aber HTTP/1.1 rät im Allgemeinen davon ab .
Zum Vergleich von Last-Modified
Und ETag
siehe diese:
Beachten Sie, dass Last-Modified
Als HTTP/1.0-Kompatibilitätsfunktion angesehen wird . ETag
kann denselben Wert enthalten und genauso funktionieren (außer mit If-None-Match
Anstelle von If-Modified-Since
).
Als Randnotiz möchte ich hinzufügen, dass der vorgeschlagene Standard RFC 7232 vorhanden ist und sich auf Details von Entitäts-Tags und bedingten Anforderungen bezieht. In Anhang A finden Sie Änderungen gegenüber HTTP/1.1 .