wake-up-neo.com

So konfigurieren Sie ETag mit Browser-Caching

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.

  1. Habe ich ETag richtig verstanden?
  2. Wie konfiguriere ich es? Ich habe mich umgesehen, konnte aber keine Informationen zur Konfiguration finden.
5
sam

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
4
Ed-AITpro

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>
3
Mitja Gustin

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.

2
Adrien

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:

  1. Der Server fügt einer Antwort mit einer bereitgestellten Ressource den Header ETag hinzu.

  2. Der Client speichert die Ressource im Cache und merkt sich das Entity-Tag (den Wert von ETag).

  3. 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.

  4. 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 .

0
Palec