Cache-Busting über Parameter

Lesezeit: 6 Minuten

Wir wollen Bust bei Produktionsbereitstellungen zwischenspeichern, aber keine Zeit damit verschwenden, ein System dafür zu finden. Mein Gedanke war, einen Parameter am Ende von CSS- und JS-Dateien mit der aktuellen Versionsnummer anzuwenden:

<link rel="stylesheet" href="https://stackoverflow.com/questions/9692665/base_url.com/file.css?v=1.123"/>

Zwei Fragen: Wird dies den Cache effektiv brechen? Wird der Parameter bewirken, dass der Browser die Antwort von dieser URL niemals zwischenspeichert, da der Parameter anzeigt, dass es sich um dynamischen Inhalt handelt?

Der Param ?v=1.123 gibt eine Abfragezeichenfolge an, und der Browser wird daher denken, dass es sich um einen neuen Pfad von beispielsweise ?v=1.0. Dadurch wird es aus der Datei geladen, nicht aus dem Cache. Wie du willst.

Und der Browser geht davon aus, dass die Quelle beim nächsten Aufruf gleich bleibt ?v=1.123 und sollte Cache es mit dieser Zeichenfolge. Es bleibt also zwischengespeichert, wie auch immer Ihr Server eingerichtet ist, bis Sie zu wechseln ?v=1.124 oder so weiter.

  • Zitat von Steve Souders: “Um den Vorteil des Cachings durch beliebte Proxys zu nutzen, vermeiden Sie das Revving mit einer Abfragezeichenfolge und ändern Sie stattdessen den Dateinamen selbst.” Die vollständige Erklärung finden Sie hier: stevesouders.com/blog/2008/08/23/…

    – lao

    18. Februar 2016 um 13:48 Uhr

  • Dieser Blogbeitrag ist jetzt fast ein Jahrzehnt alt. Denken Sie, dass Cache-Anbieter und CDNs dies noch berücksichtigen müssen? Squid scheint in der Lage zu sein, Dokumente mit Abfragezeichenfolgen zwischenzuspeichern jetzt.

    – jeteon

    9. März 2016 um 22:44 Uhr

  • Vielleicht hilft das jemandem: Ich persönlich verwende den Zeitstempel der Dateiänderung als “automatischen” Versionsparameter, z. <link rel="stylesheet" href="style.css?v=1487935578" />

    – ölna

    28. Februar 2017 um 18:50 Uhr

  • Ich persönlich verstehe nicht, warum, aber Lara Hogan (Swanson) (Engineering Manager bei Etsy) empfiehlt nicht, Abfrageparameter zum Cache-Busting zu verwenden. Ich denke, es hat mit Cache-Proxys zwischen dem Benutzer und dem Server zu tun.

    – Sam Ruby

    20. Juli 2017 um 13:01 Uhr

Cache Busting uber Parameter
Pekka

Zwei Fragen: Wird dies den Cache effektiv brechen?

Jawohl. Sogar Stack Overflow verwendet diese Methode, obwohl ich mich erinnere, dass sie (mit ihren Millionen von Besuchern pro Tag und Millionen verschiedener Client- und Proxy-Versionen und -Konfigurationen) einige ungewöhnliche Fälle hatten, in denen selbst dies nicht ausreichte, um den Cache zu brechen. Die allgemeine Annahme ist jedoch, dass dies funktionieren wird und eine geeignete Methode ist, um das Caching auf Clients zu unterbrechen.

Wird der Parameter bewirken, dass der Browser die Antwort von dieser URL niemals zwischenspeichert, da der Parameter anzeigt, dass es sich um dynamischen Inhalt handelt?

Nein. Der Parameter ändert die Caching-Richtlinie nicht; Die vom Server gesendeten Caching-Header gelten weiterhin, und wenn keine gesendet werden, gelten die Standardeinstellungen des Browsers.

  • @spender Ich kann die Referenz gerade nicht finden, fürchte ich, es gab einen langen Blogartikel oder eine SO-Antwort, in der Jeff Atwood darüber spricht (IIRC).

    – Pekka

    23. Mai 2014 um 6:50 Uhr


  • @spender Ich habe gelesen, dass einige Proxy-Server (entweder alt oder so konfiguriert werden können) die Abfragezeichenfolge beim Caching ignorieren.

    – Herr weiß

    22. August 2014 um 12:03 Uhr

  • @spender – ich habe dasselbe gehört, und ich denke, das Ändern des Dateinamens oder des Pfads ist die beste Option. Es ist möglicherweise am einfachsten, alle Ihre statischen Dateien einfach unter einem versionierten Ordnernamen verschieben zu lassen, z. /static/v22/file.cssda Sie mehrere Dateien mit einem einzigen Ordner umbenennen könnten, z /static/v23/file.css und /static/v23/mystuff.js

    – Brad Parks

    6. Oktober 2015 um 16:18 Uhr


Es ist sicherer, die Versionsnummer in den eigentlichen Dateinamen zu setzen. Dadurch können mehrere Versionen gleichzeitig vorhanden sein, sodass Sie eine neue Version einführen können, und wenn noch zwischengespeicherte HTML-Seiten vorhanden sind, die die ältere Version anfordern, erhalten sie die Version, die mit ihrem HTML funktioniert.

Beachten Sie, dass jQuery in einer der größten versionierten Bereitstellungen im Internet Versionsnummern im tatsächlichen Dateinamen verwendet und mehrere Versionen ohne spezielle serverseitige Logik sicher koexistieren kann (jede Version ist nur eine andere Datei).

Dadurch wird der Cache einmal gesprengt, wenn Sie neue Seiten und neue verknüpfte Dateien bereitstellen (was Sie möchten), und von da an können diese Versionen effektiv zwischengespeichert werden (was Sie auch möchten).

  • Ich stimme dem zu, aber es ist viel einfacher, Sinatra einfach ?v=<%=VERSION%> an alle CSS- und JS-Anfragen anhängen zu lassen, als jede Datei einzeln kontrollieren zu müssen. Schließlich werden wir zu sinatra-assetpack wechseln, das alle Dateien vorverarbeitet und komprimiert und tatsächlich eine Versionsnummer an den Dateinamen anhängt, wodurch wir sie dann viel einfacher individuell steuern können.

    – Brad Hermann

    13. März 2012 um 21:56 Uhr

  • Ich stimme zu, dass das Einfügen der Versionsnummer in den Dateinamen die ultimativ sicherste Lösung ist, wenn Sie 10000% sicher sein möchten, aber ich folge nicht dem Argument “mehrere Versionen müssen gleichzeitig existieren”. Eine URL mit einem Abfrageparameter unterscheidet sich von derselben URL mit einem anderen Abfrageparameter. Sie sollten vom Client als zwei verschiedene Ressourcen behandelt werden; Wenn nicht, ist der Client defekt.

    – Pekka

    13. März 2012 um 21:58 Uhr


  • @Pekka – Die Sache mit der Versionsnummer kann zulassen, dass mehrere Versionen gleichzeitig existieren, aber das erfordert die Zusammenarbeit des Servers, um den Abfrageparameter der richtigen tatsächlichen Datei zuzuordnen. Ich glaube nicht, dass das OP das hier tut, und es gibt wenig Grund zu verlangen, dass diese Komplikation beim Ändern des Dateinamens viel einfacher ist und keine Serverkooperation erfordert. Natürlich kann beides funktionieren.

    – jfriend00

    13. März 2012 um 22:15 Uhr

Wie andere gesagt haben, wird Cache-Busting mit einem Abfrageparameter normalerweise als schlechte Idee ™ angesehen, und das schon seit langem. Es ist besser, die Version im Dateinamen wiederzugeben. HTML5-Boilerplate empfiehlt dagegen unter anderem unter Verwendung der Abfragezeichenfolge.

Abgesehen davon scheinen alle Empfehlungen, die ich gesehen habe und die eine Quelle zitierten, ihre Weisheit von a zu beziehen Artikel 2008 von Steve Souders. Seine Schlussfolgerungen basieren auf dem damaligen Verhalten von Stellvertretern und können heutzutage relevant sein oder auch nicht. Mangels aktuellerer Informationen ist die Änderung des Dateinamens jedoch die sichere Option.

Der Cache wird einmal gebustet, nachdem der Client die Ressource heruntergeladen hat, wird jede andere Antwort aus dem Client-Cache bereitgestellt, es sei denn:

  1. Der Parameter v wird aktualisiert.
  2. Der Client löscht seinen Cache

Cache Busting uber Parameter
Ken Liu

Im Allgemeinen sollte dies in Ordnung sein, aber es ist möglich, dass dies nicht funktioniert, wenn ein Zwischencache (ein Proxy) vorhanden ist, der so konfiguriert ist, dass er die Anforderungsparameter ignoriert.

Wenn Sie beispielsweise statische Inhalte über das Akamai CDN bereitstellen, kann es so konfiguriert werden, dass Anforderungsparameter ignoriert werden, um Cache-Busting mit dieser Methode zu verhindern.

Cache Busting uber Parameter
Bobby Jack

Es hängt sehr stark davon ab, wie robust Ihr Caching sein soll. Zum Beispiel der Squid-Proxy-Server (und möglicherweise andere) standardmäßig auf nicht zwischenspeichern URLs, die mit einem Querystring geliefert werden – zumindest, als dieser Artikel geschrieben wurde. Wenn es Ihnen nichts ausmacht, wenn bestimmte Anwendungsfälle unnötige Cache-Fehler verursachen, fahren Sie mit den Abfrageparametern fort. Aber es ist sehr Es ist einfach, ein dateinamenbasiertes Cache-Busting-Schema einzurichten, das dieses Problem vermeidet.

  • Der Squid-Proxy, der im Artikel von Steve Souders zitiert wurde, hat seine Standard-Caching-Richtlinie geändert. Seit Version 2.7 (Mai 2008) und Version 3.1 (März 2010) besteht das Standardverhalten darin, dynamische Inhalte zwischenzuspeichern.

    – Josh Rack

    12. Juni 2015 um 13:45 Uhr

924570cookie-checkCache-Busting über Parameter

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy