ebody: Cache und veränderte Dateien

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.

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

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

    --
    sumpsi - posui - obstruxi
  3. 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

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. 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 ein If modified since hinzuzufügen. Das wiederum würde den Server dann ggf. dazu veramlassen, ein not modified zu senden, oder aber die Ressource mit einem neuen Last 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

      --
      Möge der Forumsgeist ewig leben!