Cache und veränderte Dateien
ebody
- browser
- htaccess
Hallo,
in der .htaccess Datei nutze ich u.a.
<IfModule mod_headers.c>
<filesMatch ".(ico|pdf|flv|jpg|svg|jpeg|png|gif|js|css|swf|woff|woff2|ttf)$">
Header set Cache-Control "max-age=31536000, public"
</filesMatch>
</IfModule>
um Dateien zu cachen. Wenn ich jetzt eine .css anpasse kommt es zu Fehlern in der Darstellung, weil noch die .css aus dem Cache verwendet wird. Das möchte ich gerne verhindern.
1 Möglichkeit wäre der .css Datei eine Nummer z.B. anzuhängen und diese bei jeder Anpassung zu ändern. Das würde ich aber gerne vermeiden.
Gibt es eine andere Möglichkeit, z.B. ein Befehl für die .htaccess Datei, das veränderte Dateien erkannt werden und erstmal nicht aus dem Cache geladen werden? Das man z.B. angibt nur Dateien aus dem Cache zu laden, die ein Upload Datum haben, was älter als 1 Woche ist?
Gruß ebody
must-revalidate könnte helfen.
Erzeugt aber jedes Mal einen Request und lohnt sich deswegen nur wenn die Datei eine gewisse Größe (mindestens ein paar KBytes) hat. Bei kleineren Dateien also ggf. gar nicht cachen.
Andere Variante: Cache-Dauer auf ein paar Minuten festlegen.
Andere Variante: Updates planen. Rechtzeitig von tagelanger Cachedauer auf eine solche mit einem fixen Ablaufdatum umstellen (Expires) und zu diesem Zeitpunkt auch das Update der Webseite machen.
Tach!
Gibt es eine andere Möglichkeit, z.B. ein Befehl für die .htaccess Datei, das veränderte Dateien erkannt werden und erstmal nicht aus dem Cache geladen werden?
Wie soll der Client davon etwas mitbekommen? Der Cache ist ja dafür da, dass er eine gewisse Zeit lang keine Anfragen zur Ressource stellt. Somit bekommt er serverseitige Änderungen nicht mit.
Das man z.B. angibt nur Dateien aus dem Cache zu laden, die ein Upload Datum haben, was älter als 1 Woche ist?
Die Cache-Angaben stehen im Header der jeweiligen Ressource. Wenn der Client die HTML-Datei anfragt, dann kann er aus ihrem Inhalt und den Headern keine Angaben zu anderen Ressourcen finden.
dedlfix.
Hallo ebody,
ich denke, du brauchst die laufende Nummer (oder Timestamp) als Cache-Invalidator. Das ist natürlich lästig.
Wenn Du Deine Ressourcen über PHP auslieferst, kannst Du es darüber optimieren. Bei einer reinen HTML Ressource geht's natürlich nicht.
Du könntest höchstens eine kleine Script-Lösung bauen:
<script>
var cacheValidation="20200415160123";
</script>
<script src="/scripts/validateCache.js">
und im validateCache.js prüfst Du, ob die globale Variable cacheValidation mit dem erwarteten Wert übereinstimmt. Wenn validateCache veraltet ist (also noch im Cache), kannst Du den Anwender auffordern, einen Reload der Seite anzufordern.
Das ist aber HAESSLICH für die Anwender.
Eigentlich müsstest Du in deinen Toolstack ein Werkzeug aufnehmen, dass den cache invalidation parameter beim Deploy auf den Server automatisch für Dich erledigt. Keine Ahnung ob's sowas fertig gibt. Ein Bundler kann das vielleicht mit übernehmen.
Rolf
Hello,
mMn sollte es genügen, einen Last Modified
-Response-Header mitzusenden. Das sollte jeden vernünftigen Browser dazu bewegen, beim nächsten Request ein If modified since
hinzuzufügen. Das wiederum würde den Server dann ggf. dazu veranlassen, ein not modified
zu senden, oder aber die Ressource mit einem neuen Last Modified
erneut auszuliefern.
Bei Bildern klappt das doch auch. Wieso sollte es bei CSS-Files nicht auch klappen?
Die Header-Direktive kannst Du generell im VirtHost für CSS-Files einstellen.
Glück Auf
Tom vom Berg
Liebe Mitdenker, liebe Wissende, liebe Neugierige,
mMn sollte es genügen, eine
Last Modified
-Response-Header mitzusenden. Das sollte jeden vernünftigen Browser dazu bewegen, beim nächsten Request einIf modified since
hinzuzufügen. Das wiederum würde den Server dann ggf. dazu veramlassen, einnot modified
zu senden, oder aber die Ressource mit einem neuenLast Modiefied
erneut auszuliefern.Bei Bildern klappt das doch auch. Eoeso sollte es bei CSS-Files nicht auch klappen?
Die Header-Direktive kannst Du generell im VirtHost für CSS-Files einstellen.
Mit Last-Modified
funktioniert es bei mir. Mit Cache-Control
kann ich das Verhalten der unterschiedlichen Browser nicht wirklich nachvollziehen.
Ich habe zum Ausliefern von Bildern ohnehin immer Toms Funktion aus dem PHP-Upload-Artikel benutzt. Da wird auch Last-Modified
benutzt.
Dass man das für bedingungslos auszuliefernde Ressourcen auch fest im Apachen vorgeben kann, wusste ich auch noch nicht. Wieder was gelernt :-)
Spirituelle Grüße
Euer Robert