Ich versuche, ein grundlegendes Verhalten in Bezug auf meine Caching-Strategie zu haben: Dateien sollten jedes Mal zwischengespeichert und mit dem Server erneut validiert werden. Also möchte ich, dass Apache einen 304 zurückschickt.
Hier ist der Dialog, der bei jeder Browseraktualisierung angezeigt wird:
Status Code:200 OK
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie: ...
Host:...
If-Modified-Since:Tue, 14 Oct 2014 15:10:37 GMT
If-None-Match:"1461-505636af08fcd-gzip"
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
Response Headers
Accept-Ranges:bytes
Cache-Control:No-cache
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:1412
Content-Type:text/html
Date:Tue, 14 Oct 2014 16:58:05 GMT
ETag:"1461-505636af08fcd-gzip"
Keep-Alive:timeout=5, max=99
Last-Modified:Tue, 14 Oct 2014 15:10:37 GMT
Server:Apache/2.4.6 (Ubuntu)
Vary:Accept-Encoding
(Dies ist von Chrome Devtools, wobei Cache deaktivieren deaktiviert ist.)
Sie können sehen, dass die Antwort den Header "Cache-Steuerung: Kein Cache" enthält und dass der Header "Wenn geändert seit" mit dem Header "Zuletzt geändert" übereinstimmt. Das ETag passt auch.
Sollte Apache in diesem Fall nicht eine 304 senden?
BEARBEITEN
Deaktivieren von ETags in Apache mit
Header unset ETag
macht das Caching-Verhalten vorhersehbarer ...
Cache-Control:max-age=0
den Cache deaktiviert, so dass Sie dieCache-Control:No-cache
Antwort sehen.Antworten:
Dies scheint ein alter Fehler zu sein , der erklärt, warum dies
Header unset ETag
einen Unterschied macht.Apache 2.4.0+ hängt den Namen der Komprimierungsmethode automatisch an das ETag an (wie in Ihren Headern angegeben) und verhindert eine 304-Antwort.
Neueste Versionen von mod_deflate unterstützen ein DeflateAlterETag , mit dem dieses Verhalten gesteuert werden kann:
quelle
DeflateAlterETag Remove
Option, genau dasDieser fällt in der Anfrage als etwas seltsam auf:
Wahrscheinlich wichtiger ist jedoch, dass der zurückgegebene Inhalt HTML ist. Wird es dynamisch generiert? Apache kann eine 304-Antwort senden, aber wenn Sie keinen statischen Inhalt bereitstellen, ist es nicht Apaches Aufgabe, diesen Aufruf zu tätigen, und es hängt von Ihrer Anwendungslogik ab. ZB haben die meisten PHP-Anwendungen eine begrenzte Unterstützung für solche Dinge.
Ein Front-End-Cache kann hilfreich sein, da die Caching-App die Änderungszeit, das Etag usw. überprüfen kann, jedoch nur, wenn sowohl die Anwendung als auch die Anforderungsheader cachefreundlich sind. Beispielsweise muss die Anwendung geeignete Header festlegen, um anzuzeigen, dass der Inhalt zwischengespeichert werden kann, und Dinge wie der Cache-Steuerungsheader in Ihrer Anforderung negieren den Cache. Ihre Header sehen nicht cachefreundlich aus.
quelle
Wenn Sie Apache mit konfiguriert haben
Cache-Control:No-cache
, sendet Apache niemals eineHTTP 304 Not modified
an den Client.Wenn Sie einige Anforderungen erneut validieren möchten, setzen Sie eine
Cache-Control:No-cache
nur auf die Seiten, auf denen Sie diese benötigen. Sie müssen nicht alle Ressourcen erneut validieren und verschwenden dadurch Bandbreite.quelle