Gibt es eine Möglichkeit, Code auf meine Seite zu setzen, damit beim Besuch einer Website der Browser-Cache geleert wird, damit er die Änderungen anzeigen kann?
Verwendete Sprachen: ASP.NET, VB.NET und natürlich HTML, CSS und jQuery.
Wenn es darum geht .cssund sich .jsändert, besteht eine Möglichkeit zum "Cache-Busting" darin _versionNo, dem Dateinamen für jede Version etwas wie " " anzuhängen. Zum Beispiel:
script_1.0.css // This is the URL for release 1.0
script_1.1.css // This is the URL for release 1.1
script_1.2.css // etc.
Oder alternativ nach dem Dateinamen:
script.css?v=1.0 // This is the URL for release 1.0
script.css?v=1.1 // This is the URL for release 1.1
script.css?v=1.2 // etc.
Sie können diesen Link überprüfen, um zu sehen, wie es funktionieren könnte.
Dies ist eine ziemlich gute Lösung und kann sogar von Ihrem Build-System automatisiert werden (und sollte es auch sein). Stackoverflow verwendet beispielsweise diesen Ansatz.
Derobert
7
SO verwendet jetzt GET-Argumente.
Saeb Amini
60
Besser noch ist es, den Dateinamen unverändert zu lassen, aber die Versionsnummer als Querystring-Parameter anzuhängen, d script.js?v=1.2. H. (Wenn Sie die Versionen nicht im Auge behalten, verwenden Sie einfach die zuletzt geänderte Zeit der Datei, was noch einfacher ist.) Ich bin mir nicht sicher, ob das der vorherige Kommentator gemeint hat!
Doin
5
Wie macht das jeder mit Versionskontrolle? Scheint ein echter Schmerz zu sein.
Shawn
1
Bei der Versionskontrolle von @Shawn können Sie die <link />Tags dynamisch rendern und die Version der Anwendung als Abfragezeichenfolgenparameter einfügen . Alternativ haben einige CMS eine "Client-Ressourcenversion" als CMS-weite Einstellung, die angehängt wird. Der Administrator der Site kann diese Version nr manuell erhöhen, und Aktualisierungen des CMS können sie auch automatisch aktualisieren. Fazit: Sie müssen die Datei-URLs dynamisch rendern.
Dies hilft nicht viel, wenn es bereits zwischengespeichert ist. Da es zwischengespeichert ist, wird der Server nicht abgefragt und kann daher nicht ohne Cache antworten. Außerdem sollte dieses Meta-Tag wirklich nicht verwendet werden, da der Hinweis besagt, dass es mit Web-Caches kaputt geht.
Derobert
1
+1 was derobert gesagt hat. Es ist immer besser, HTTP-Header zu verwenden, um Clients und Web-Caches Cache-Richtlinien vorzuschlagen, aber selbst das funktioniert nicht, um ein erneutes Laden des Caches zu erzwingen.
4
+1 für Ihre zweite Lösung. Ich habe das Problem, dass der Cache erst beim ersten Mal geleert werden sollte, nachdem ein Administrator ein Update durchgeführt hat. Dieser Ansatz sollte das lösen
Jules Colle
Das vollständige Deaktivieren des Caches ist normalerweise eine sehr schlechte Idee.
Jordanien
73
Update 2012
Dies ist eine alte Frage, aber ich denke, sie muss aktueller beantwortet werden, da es jetzt eine Möglichkeit gibt, das Zwischenspeichern von Websites besser zu steuern.
In Offline-Webanwendungen (bei denen es sich eigentlich um jede HTML5-Website handelt) applicationCache.swapCache()kann die zwischengespeicherte Version Ihrer Website aktualisiert werden, ohne dass die Seite manuell neu geladen werden muss.
// Check if a new cache is available on page load.
window.addEventListener('load',function(e){
window.applicationCache.addEventListener('updateready',function(e){if(window.applicationCache.status == window.applicationCache.UPDATEREADY){// Browser downloaded a new app cache.// Swap it in and reload the page to get the new hotness.
window.applicationCache.swapCache();if(confirm('A new version of this site is available. Load it?')){
window.location.reload();}}else{// Manifest didn't changed. Nothing new to server.}},false);},false);
Im Web ändern sich die Dinge schnell. Diese Frage wurde 2009 gestellt und 2012 habe ich ein Update über eine neue Methode zur Behandlung des in der Frage beschriebenen Problems veröffentlicht. Weitere 4 Jahre vergingen und jetzt scheint es, dass es bereits veraltet ist. Vielen Dank an cgaldiolo für den Hinweis in den Kommentaren.
Diese Funktion wird gerade von der Webplattform entfernt. (Dies ist ein langer Prozess, der viele Jahre dauert.) Von der Verwendung einer der Offline-Webanwendungsfunktionen zu diesem Zeitpunkt wird dringend abgeraten. Verwenden Sie stattdessen Servicemitarbeiter.
Veraltet Diese Funktion wurde aus den Webstandards entfernt. Obwohl einige Browser dies möglicherweise noch unterstützen, wird es gerade gelöscht. Verwenden Sie es nicht in alten oder neuen Projekten. Seiten oder Web-Apps, die es verwenden, können jederzeit beschädigt werden.
Bedeutet dies, dass Sie eine Cache-Manifestdatei verwenden und verwalten müssen?
Sam
Warnung: Die AppCache-Schnittstelle (Application Cache) ist veraltet
cgaldiolo
59
Also, was ist die aktuelle Empfehlung ab 2017?
Garrett
Das Hauptproblem bei diesem Thema besteht darin, dass das vom Viewer verwendete Gerät weiterhin die zwischengespeicherten Versionen verwendet, da der interne Speicher des Benutzergeräts voll wird. Es scheint in einer zwischengespeicherten Version der Seite hängen zu bleiben und keine Elemente im Dokument zu aktualisieren. passiert das nur in chrom ?? Das ist der einzige Browser, auf dem ich es erlebt habe.
user2585548
4
2017: Verwenden Sie Servicemitarbeiter.
Digitai
27
Nicht als solches. Eine Methode besteht darin, bei der Bereitstellung von Inhalten die entsprechenden Header zu senden, um den Browser zum erneuten Laden zu zwingen:
Wenn Sie "cache header"hier auf SO nach etwas Ähnlichem suchen , finden Sie ASP.NET-spezifische Beispiele.
Eine andere, weniger saubere, aber manchmal nur Möglichkeit, die Header auf der Serverseite nicht zu steuern, besteht darin, der aufgerufenen Ressource einen zufälligen GET-Parameter hinzuzufügen:
Es ist wirklich besser, die Dateien richtig zu versionieren. Dies ist eine ziemlich große Verschwendung von Bandbreite und verlangsamt, was wahrscheinlich noch wichtiger ist, Ihre Site erheblich.
Derobert
8
Das hängt wirklich von der Situation ab, nicht wahr? Wenn Sie ein CMS programmieren und sicherstellen müssen, dass alle geänderten Ressourcen ordnungsgemäß aktualisiert werden, führt manchmal kein Weg an einer dieser beiden Optionen vorbei.
Pekka
Lösungen wie diese sollten verneint werden. Es liegt an uns, den CO2-Fußabdruck des Internets so gering wie möglich zu halten.
Timing
14
Für statische Ressourcen besteht das richtige Caching darin, Abfrageparameter mit dem Wert jeder Bereitstellung oder Dateiversion zu verwenden. Dadurch wird der Cache nach jeder Bereitstellung geleert.
Im <body>Abschnitt habe ich die Onload-Funktion eingefügt:
<bodyonload="checkForUpdate()">
In cache.manifestich alle Dateien gesetzt haben möchte ich Cache. Es ist jetzt wichtig, dass es in meinem Fall (Apache) funktioniert, indem jedes Mal der "Versions" -Kommentar aktualisiert wird. Es ist auch eine Option, Dateien mit "? Ver = 001" oder etwas am Ende des Namens zu benennen, aber es wird nicht benötigt . Das Ändern # version 1.01löst nur ein Cache-Aktualisierungsereignis aus.
CACHE MANIFEST
# version 1.01
style.css
imgs/logo.png
#all other files
Es ist wichtig, 1., 2. und 3. Punkte nur in index.html aufzunehmen. Andernfalls
GET http://foo.bar/resource.ext net::ERR_FAILED
tritt auf, weil jede "untergeordnete" Datei versucht, die Seite zwischenzuspeichern, während die Seite bereits zwischengespeichert ist.
In die update_cache.jsDatei habe ich diesen Code eingefügt:
Jetzt ändern Sie nur noch die Dateien und im Manifest müssen Sie den Versionskommentar aktualisieren. Wenn Sie jetzt die Seite index.html besuchen, wird der Cache aktualisiert.
Die Teile der Lösung sind nicht meine, aber ich habe sie über das Internet gefunden und zusammengestellt, damit es funktioniert.
Kann ich wissen, wo CACHE.MANIFEST geschrieben steht?
Shweta Gulati
1
Shweta Gulati Die Manifestdatei sollte sich im selben Ordner wie die "Index" -Datei befinden. Wie oft funktioniert es nicht?
Wojtek Mazurek
1
@ShwetaGulati Ja, der Cache erkennt keine Änderungen in HTML-Dateien. Deshalb müssen Sie die Versionsnummer in der Manifestdatei aktualisieren, da diese auf Änderungen überprüft wird. Es ist wirklich schwer, dir zu helfen, weil ich keine Details kenne. Bitte sagen Sie mir, ob Sie alle gewünschten zwischengespeicherten Dateien in das Manifest aufgenommen haben. Die Pfade sollten relativ zur Manifestdatei sein. Sie können mir die Adresse Ihrer Website geben und ich kann sagen, was los ist :)
Wojtek Mazurek
1
@ShwetaGulati Dies liegt daran, dass der Browser einige Dateien automatisch zwischenspeichert, um das Laden der Seite zu beschleunigen. Es ist das Standardverhalten und hängt nicht nur vom Browser ab, sodass Sie es in keiner Weise einstellen können. Insbesondere js-Dateien befinden sich im Bereich des Browsers, da sie normalerweise auf allen Seiten der Website verwendet werden. Es ist daher ratsam, sie zwischenzuspeichern. Es gibt keine andere Möglichkeit, als alle Dateinamen in die Manifestdatei zu schreiben, um alle Dateien zwischenzuspeichern. Wenn Sie welche finden, sagen Sie es mir, weil ich sie auch brauche :)
Wojtek Mazurek
1
Der absolute Pfad zu Ihren Dateien spielt keine Rolle. Relativer Pfad von Adressangelegenheiten, da der Browser die Anforderung von Dateien sendet. F.ex: Ich habe die Domain example.com und sie befindet sich auf serwer names.com. Mein Platz darauf ist example.names.com. Also verbinde ich meine example.com-Domain mit meinem Serverraum example.names.com als Weiterleitung. Dazu muss ich den Ordner als Ziel dieser Umleitung festlegen. Wenn ich also mehrere Sites auf example.names.com haben möchte, erstelle ich den Ordner "name1", setze die Umleitung darauf und lege alle meine Dateien darin ab. Von hier aus werden Pfade gezählt. Wenn ich name1 \ scripts \ test.js in der Manifestdatei habe, schreibe ich scripts \ test.js.
Wojtek Mazurek
7
Ich hatte einen Fall, in dem ich Fotos von Kunden online machte und die Div aktualisieren musste, wenn ein Foto geändert wurde. Der Browser zeigte immer noch das alte Foto. Also habe ich den Hack benutzt, eine zufällige GET-Variable aufzurufen, die jedes Mal eindeutig ist. Hier ist es, wenn es jemandem helfen könnte
BEARBEITEN Wie von anderen hervorgehoben, ist das Folgende eine viel effizientere Lösung, da Bilder nur dann neu geladen werden, wenn sie geändert werden, wobei diese Änderung anhand der Dateigröße identifiziert wird:
Dies ist überhaupt nicht elegant. Es würde dazu führen, dass die Site das Bild jedes Mal neu lädt, wenn viel Zeit mit dem Herunterladen von Ressourcen verschwendet wird. Eine bessere Lösung wäre die Verwendung der Dateigröße anstelle einer Zufallszahl. Dadurch wird der Cache nur dann erneut validiert, wenn die Datei tatsächlich vorhanden ist Änderungen
Roberto Arosemena
8
Oder ein Hash der Bildbytes
Taylor Edmiston
1
Es hängt alles von den Anforderungen eines Benutzers ab. Bei einer großen Anzahl von Fotos würde sich das Szenario von einigen Fotos unterscheiden. Das Überprüfen der Dateigröße würde Bandbreite sparen, aber auch zusätzliche Verarbeitung hinzufügen und möglicherweise das Laden der Seite verlangsamen. In meinem Fall, in dem sich die Bilder häufig änderten und es eine wichtige Geschäftsentscheidung war, dass der Benutzer die aktuellsten Bilder erhielt, war dies eine perfekte Lösung.
Zeeshan
Sie können es sogar zu einem statischen Wert in der Konfiguration machen, dies ist keineswegs ein idealer Ansatz.
Viele Antworten verfehlen den Punkt - die meisten Entwickler sind sich bewusst, dass das Deaktivieren des Caches ineffizient ist. Es gibt jedoch viele häufige Umstände, in denen die Effizienz unwichtig ist und das Standard-Cache-Verhalten stark beeinträchtigt ist.
Dazu gehören verschachtelte, iterative Skripttests (das große!) Und fehlerhafte Problemumgehungen von Drittanbietern. Keine der hier angegebenen Lösungen ist ausreichend, um solche häufigen Szenarien anzugehen. Die meisten Webbrowser sind viel zu aggressiv im Caching und bieten keine sinnvollen Mittel, um diese Probleme zu vermeiden.
Das Aktualisieren der URL auf Folgendes funktioniert für mich:
/custom.js?id=1
Durch Hinzufügen einer eindeutigen Nummer nach ?id=und Erhöhen dieser Nummer für neue Änderungen müssen Benutzer nicht drücken CTRL + F5, um den Cache zu aktualisieren. Alternativ können Sie eine Hash- oder String-Version der aktuellen Zeit oder der darauf folgenden Epoche anhängen?id=
Hier ist die MDSN-Seite zum Festlegen des Caching in ASP.NET.
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60))Response.Cache.SetCacheability(HttpCacheability.Public)Response.Cache.SetValidUntilExpires(False)Response.Cache.VaryByParams("Category")=TrueIfResponse.Cache.VaryByParams("Category")Then'...
End If
Ich bin mir nicht sicher, ob Ihnen das wirklich helfen könnte, aber so sollte das Caching in jedem Browser funktionieren. Wenn der Browser eine Datei anfordert, sollte er immer eine Anforderung an den Server senden, es sei denn, es gibt einen "Offline" -Modus. Der Server liest einige Parameter wie Änderungsdatum oder Etags.
Der Server gibt eine 304-Fehlerantwort für NOT MODIFIED zurück und der Browser muss seinen Cache verwenden. Wenn das Etag auf der Serverseite nicht validiert wird oder das Änderungsdatum unter dem aktuellen Änderungsdatum liegt, sollte der Server den neuen Inhalt mit dem neuen Änderungsdatum oder den neuen Änderungsdaten oder beiden zurückgeben.
Wenn keine Caching-Daten an den Browser gesendet werden, ist das Verhalten vermutlich unbestimmt. Der Browser kann Dateien zwischenspeichern oder nicht, die nicht angeben, wie sie zwischengespeichert werden. Wenn Sie in der Antwort Caching-Parameter festlegen, werden Ihre Dateien korrekt zwischengespeichert, und der Server kann dann einen 304-Fehler oder den neuen Inhalt zurückgeben.
So sollte es gemacht werden. Die Verwendung von zufälligen Parametern oder Versionsnummern in URLs ist mehr wie ein Hack als alles andere.
Nach dem Lesen habe ich gesehen, dass es auch ein Ablaufdatum gibt. Wenn Sie ein Problem haben, ist möglicherweise ein Ablaufdatum eingerichtet. Mit anderen Worten, wenn der Browser Ihre Datei zwischenspeichert, da sie ein Ablaufdatum hat, sollte er sie nicht vor diesem Datum erneut anfordern müssen. Mit anderen Worten, es wird niemals die Datei an den Server senden und niemals eine 304 erhalten, die nicht geändert wurde. Der Cache wird einfach verwendet, bis das Ablaufdatum erreicht oder der Cache geleert ist.
Das ist also meine Vermutung, Sie haben eine Art Ablaufdatum und Sie sollten zuletzt geänderte Etags oder eine Mischung aus allem verwenden und sicherstellen, dass es kein Ablaufdatum gibt.
Wenn die Benutzer häufig aktualisieren und die Datei nicht häufig geändert wird, ist es möglicherweise ratsam, ein großes Ablaufdatum festzulegen.
Ich habe eine kleine Datei, in der sich die HTML-Dateien befinden:
"versio.txt":
v00.5.0014
Diese Funktion wird auf allen meinen Seiten aufgerufen. Wenn Sie sie laden, wird überprüft, ob der Versionswert von localStorage niedriger als die aktuelle Version ist, und a
location.reload(true);
... um das Neuladen vom Server statt vom Cache zu erzwingen.
(Natürlich können Sie anstelle von localStorage Cookies oder anderen dauerhaften Client-Speicher verwenden.)
Ich habe mich wegen der Einfachheit für diese Lösung entschieden, da nur das Verwalten einer einzelnen Datei "versio.txt" das Neuladen der gesamten Site erzwingt.
Die queryString-Methode ist schwer zu implementieren und wird auch zwischengespeichert (wenn Sie von Version 1.1 zu einer früheren Version wechseln, wird sie aus dem Cache geladen, bedeutet dies, dass der Cache nicht geleert wird und alle vorherigen Versionen im Cache bleiben).
Ich bin ein kleiner Neuling und würde Ihre professionelle Überprüfung und Überprüfung schätzen, um sicherzustellen, dass meine Methode ein guter Ansatz ist.
Zusätzlich zum Festlegen der Cache-Steuerung: kein Cache sollten Sie den Expires-Header auf -1 setzen, wenn die lokale Kopie jedes Mal aktualisiert werden soll (einige Versionen des IE scheinen dies zu erfordern).
Es gibt einen Trick, der verwendet werden kann. Der Trick besteht darin, einen Parameter / eine Zeichenfolge an den Dateinamen im Skript-Tag anzuhängen und ihn zu ändern, wenn Sie Änderungen an der Datei vornehmen.
<script src="myfile.js?version=1.0.0"></script>
Der Browser interpretiert die gesamte Zeichenfolge als Dateipfad, obwohl was nach dem "?" sind Parameter. Jetzt passiert also, dass Sie beim nächsten Aktualisieren Ihrer Datei einfach die Nummer im Skript-Tag auf Ihrer Website ändern (Beispiel <script src="myfile.js?version=1.0.1"></script>) und jeder Benutzerbrowser sieht, dass sich die Datei geändert hat, und holt sich eine neue Kopie.
Browser zwingen, den Cache zu leeren oder korrekte Daten neu zu laden? Ich habe die meisten der im Stackoverflow beschriebenen Lösungen ausprobiert, einige funktionieren, aber nach einer Weile wird der Cache irgendwann zwischengespeichert und das zuvor geladene Skript oder die zuvor geladene Datei angezeigt. Gibt es eine andere Möglichkeit, den Cache zu leeren (CSS, JS usw.) und tatsächlich in allen Browsern zu funktionieren?
Bisher habe ich festgestellt, dass bestimmte Ressourcen einzeln neu geladen werden können, wenn Sie Datum und Uhrzeit Ihrer Dateien auf dem Server ändern. "Cache leeren" ist nicht so einfach wie es sein sollte. Anstatt den Cache in meinen Browsern zu leeren, wurde mir klar, dass durch "Berühren" der zwischengespeicherten Serverdateien Datum und Uhrzeit der auf dem Server zwischengespeicherten Quelldatei (auf Edge, Chrome und Firefox getestet) geändert werden und die meisten Browser automatisch die meisten herunterladen Aktuelle neue Kopie von dem, was sich auf Ihrem Server befindet (Code, Grafiken und Multimedia-Inhalte). Ich schlage vor, Sie kopieren einfach die aktuellsten Skripte auf den Server und "do the touch thing" -Lösung, bevor Ihr Programm ausgeführt wird. Dadurch wird das Datum aller Ihrer Problemdateien auf das aktuellste Datum und die aktuellste Uhrzeit geändert und anschließend eine neue Kopie heruntergeladen zu Ihrem Browser:
Ich habe einige Zeit gebraucht, um dieses Problem zu beheben (da viele Browser unterschiedlich auf verschiedene Befehle reagieren, aber alle die Uhrzeit der Dateien überprüfen und mit Ihrer heruntergeladenen Kopie in Ihrem Browser vergleichen, wenn Datum und Uhrzeit unterschiedlich sind, wird die Aktualisierung durchgeführt) kann nicht den vermeintlich richtigen Weg gehen, es gibt immer eine andere brauchbare und bessere Lösung dafür. Beste Grüße und viel Spaß beim Zelten. Übrigens touch (); oder Alternativen funktionieren in vielen Programmiersprachen, einschließlich in Javascript bash sh php, und Sie können sie in HTML einschließen oder aufrufen.
Wenn die Datei geändert wird, ist der Zeitstempel ohnehin bereits geändert, sodass es keinen Vorteil hat, ihn erneut zu erzwingen.
Fusca Software
Der Touch-Befehl ändert die Datei überhaupt nicht. Es ändert das Attribut von Datum und Uhrzeit und konvertiert es in eine neuere Version, die den Browser täuscht, um es als neue Kopie herunterzuladen.
Luis H Cabrejo
-1
Möchten Sie den Cache leeren oder nur sicherstellen, dass Ihre aktuelle (geänderte?) Seite nicht zwischengespeichert ist?
Wenn letzteres der Fall ist, sollte es so einfach sein wie
Ich habe kürzlich in einem Chrome-Beitrag über diesen Ansatz gelesen und nur auf einer Handvoll Live-Servern, Localhost- und Windows-Dateifreigaben konsistente Ergebnisse gefunden ... mit Firefox 3.6.
Antworten:
Wenn es darum geht
.css
und sich.js
ändert, besteht eine Möglichkeit zum "Cache-Busting" darin_versionNo
, dem Dateinamen für jede Version etwas wie " " anzuhängen. Zum Beispiel:Oder alternativ nach dem Dateinamen:
Sie können diesen Link überprüfen, um zu sehen, wie es funktionieren könnte.
quelle
script.js?v=1.2
. H. (Wenn Sie die Versionen nicht im Auge behalten, verwenden Sie einfach die zuletzt geänderte Zeit der Datei, was noch einfacher ist.) Ich bin mir nicht sicher, ob das der vorherige Kommentator gemeint hat!<link />
Tags dynamisch rendern und die Version der Anwendung als Abfragezeichenfolgenparameter einfügen . Alternativ haben einige CMS eine "Client-Ressourcenversion" als CMS-weite Einstellung, die angehängt wird. Der Administrator der Site kann diese Version nr manuell erhöhen, und Aktualisierungen des CMS können sie auch automatisch aktualisieren. Fazit: Sie müssen die Datei-URLs dynamisch rendern.Schauen Sie in die Cache-Steuerung und das abgelaufene META-Tag.
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="EXPIRES" CONTENT="Mon, 22 Jul 2002 11:12:01 GMT">
Eine weitere gängige Vorgehensweise besteht darin, ständig wechselnde Zeichenfolgen an das Ende der angeforderten Dateien anzuhängen. Zum Beispiel:
<script type="text/javascript" src="main.js?v=12392823"></script>
quelle
Update 2012
Dies ist eine alte Frage, aber ich denke, sie muss aktueller beantwortet werden, da es jetzt eine Möglichkeit gibt, das Zwischenspeichern von Websites besser zu steuern.
In Offline-Webanwendungen (bei denen es sich eigentlich um jede HTML5-Website handelt)
applicationCache.swapCache()
kann die zwischengespeicherte Version Ihrer Website aktualisiert werden, ohne dass die Seite manuell neu geladen werden muss.Dies ist ein Codebeispiel aus dem Anfängerhandbuch zur Verwendung des Anwendungscaches in HTML5 Rocks, in dem erläutert wird, wie Benutzer auf die neueste Version Ihrer Website aktualisiert werden:
Weitere Informationen finden Sie unter Verwenden des Anwendungscaches im Mozilla Developer Network.
Update 2016
Im Web ändern sich die Dinge schnell. Diese Frage wurde 2009 gestellt und 2012 habe ich ein Update über eine neue Methode zur Behandlung des in der Frage beschriebenen Problems veröffentlicht. Weitere 4 Jahre vergingen und jetzt scheint es, dass es bereits veraltet ist. Vielen Dank an cgaldiolo für den Hinweis in den Kommentaren.
Derzeit enthält der HTML-Standard, Abschnitt 7.9, Offline-Webanwendungen , ab Juli 2016 eine Warnung zur Ablehnung:
So auch die Verwendung des Anwendungscaches im Mozilla Developer Network, auf den ich 2012 verwiesen habe:
Siehe auch Fehler 1204581 - Hinzufügen eines Verfallshinweises für AppCache, wenn das Abfangen von Service Worker-Abrufen aktiviert ist .
quelle
Nicht als solches. Eine Methode besteht darin, bei der Bereitstellung von Inhalten die entsprechenden Header zu senden, um den Browser zum erneuten Laden zu zwingen:
Stellen Sie sicher, dass eine Webseite nicht in allen Browsern zwischengespeichert wird.
Wenn Sie
"cache header"
hier auf SO nach etwas Ähnlichem suchen , finden Sie ASP.NET-spezifische Beispiele.Eine andere, weniger saubere, aber manchmal nur Möglichkeit, die Header auf der Serverseite nicht zu steuern, besteht darin, der aufgerufenen Ressource einen zufälligen GET-Parameter hinzuzufügen:
quelle
Für statische Ressourcen besteht das richtige Caching darin, Abfrageparameter mit dem Wert jeder Bereitstellung oder Dateiversion zu verwenden. Dadurch wird der Cache nach jeder Bereitstellung geleert.
Hier ist ein Beispiel für ASP.NET MVC.
Vergessen Sie nicht, die Assembly-Version zu aktualisieren.
quelle
[email protected]().Assembly.GetName().Version
Ich hatte ein ähnliches Problem und so habe ich es gelöst:
In der
index.html
Datei habe ich Manifest hinzugefügt:Im
<head>
Abschnitt enthaltenes Skript, das den Cache aktualisiert:Im
<body>
Abschnitt habe ich die Onload-Funktion eingefügt:In
cache.manifest
ich alle Dateien gesetzt haben möchte ich Cache. Es ist jetzt wichtig, dass es in meinem Fall (Apache) funktioniert, indem jedes Mal der "Versions" -Kommentar aktualisiert wird. Es ist auch eine Option, Dateien mit "? Ver = 001" oder etwas am Ende des Namens zu benennen, aber es wird nicht benötigt . Das Ändern# version 1.01
löst nur ein Cache-Aktualisierungsereignis aus.Es ist wichtig, 1., 2. und 3. Punkte nur in index.html aufzunehmen. Andernfalls
tritt auf, weil jede "untergeordnete" Datei versucht, die Seite zwischenzuspeichern, während die Seite bereits zwischengespeichert ist.
In die
update_cache.js
Datei habe ich diesen Code eingefügt:Jetzt ändern Sie nur noch die Dateien und im Manifest müssen Sie den Versionskommentar aktualisieren. Wenn Sie jetzt die Seite index.html besuchen, wird der Cache aktualisiert.
Die Teile der Lösung sind nicht meine, aber ich habe sie über das Internet gefunden und zusammengestellt, damit es funktioniert.
quelle
Ich hatte einen Fall, in dem ich Fotos von Kunden online machte und die Div aktualisieren musste, wenn ein Foto geändert wurde. Der Browser zeigte immer noch das alte Foto. Also habe ich den Hack benutzt, eine zufällige GET-Variable aufzurufen, die jedes Mal eindeutig ist. Hier ist es, wenn es jemandem helfen könnte
BEARBEITEN Wie von anderen hervorgehoben, ist das Folgende eine viel effizientere Lösung, da Bilder nur dann neu geladen werden, wenn sie geändert werden, wobei diese Änderung anhand der Dateigröße identifiziert wird:
quelle
Viele Antworten verfehlen den Punkt - die meisten Entwickler sind sich bewusst, dass das Deaktivieren des Caches ineffizient ist. Es gibt jedoch viele häufige Umstände, in denen die Effizienz unwichtig ist und das Standard-Cache-Verhalten stark beeinträchtigt ist.
Dazu gehören verschachtelte, iterative Skripttests (das große!) Und fehlerhafte Problemumgehungen von Drittanbietern. Keine der hier angegebenen Lösungen ist ausreichend, um solche häufigen Szenarien anzugehen. Die meisten Webbrowser sind viel zu aggressiv im Caching und bieten keine sinnvollen Mittel, um diese Probleme zu vermeiden.
quelle
Siehe auch /programming/126772/how-to-force-a-web-browser-not-to-cache-images
quelle
Das Aktualisieren der URL auf Folgendes funktioniert für mich:
/custom.js?id=1
Durch Hinzufügen einer eindeutigen Nummer nach
?id=
und Erhöhen dieser Nummer für neue Änderungen müssen Benutzer nicht drückenCTRL + F5
, um den Cache zu aktualisieren. Alternativ können Sie eine Hash- oder String-Version der aktuellen Zeit oder der darauf folgenden Epoche anhängen?id=
Etwas wie
?id=1520606295
quelle
Hier ist die MDSN-Seite zum Festlegen des Caching in ASP.NET.
quelle
Ich bin mir nicht sicher, ob Ihnen das wirklich helfen könnte, aber so sollte das Caching in jedem Browser funktionieren. Wenn der Browser eine Datei anfordert, sollte er immer eine Anforderung an den Server senden, es sei denn, es gibt einen "Offline" -Modus. Der Server liest einige Parameter wie Änderungsdatum oder Etags.
Der Server gibt eine 304-Fehlerantwort für NOT MODIFIED zurück und der Browser muss seinen Cache verwenden. Wenn das Etag auf der Serverseite nicht validiert wird oder das Änderungsdatum unter dem aktuellen Änderungsdatum liegt, sollte der Server den neuen Inhalt mit dem neuen Änderungsdatum oder den neuen Änderungsdaten oder beiden zurückgeben.
Wenn keine Caching-Daten an den Browser gesendet werden, ist das Verhalten vermutlich unbestimmt. Der Browser kann Dateien zwischenspeichern oder nicht, die nicht angeben, wie sie zwischengespeichert werden. Wenn Sie in der Antwort Caching-Parameter festlegen, werden Ihre Dateien korrekt zwischengespeichert, und der Server kann dann einen 304-Fehler oder den neuen Inhalt zurückgeben.
So sollte es gemacht werden. Die Verwendung von zufälligen Parametern oder Versionsnummern in URLs ist mehr wie ein Hack als alles andere.
http://www.checkupdown.com/status/E304.html http://en.wikipedia.org/wiki/HTTP_ETag http://www.xpertdeveloper.com/2011/03/last-modified-header-vs- expire-header-vs-etag /
Nach dem Lesen habe ich gesehen, dass es auch ein Ablaufdatum gibt. Wenn Sie ein Problem haben, ist möglicherweise ein Ablaufdatum eingerichtet. Mit anderen Worten, wenn der Browser Ihre Datei zwischenspeichert, da sie ein Ablaufdatum hat, sollte er sie nicht vor diesem Datum erneut anfordern müssen. Mit anderen Worten, es wird niemals die Datei an den Server senden und niemals eine 304 erhalten, die nicht geändert wurde. Der Cache wird einfach verwendet, bis das Ablaufdatum erreicht oder der Cache geleert ist.
Das ist also meine Vermutung, Sie haben eine Art Ablaufdatum und Sie sollten zuletzt geänderte Etags oder eine Mischung aus allem verwenden und sicherstellen, dass es kein Ablaufdatum gibt.
Wenn die Benutzer häufig aktualisieren und die Datei nicht häufig geändert wird, ist es möglicherweise ratsam, ein großes Ablaufdatum festzulegen.
Meine 2 Cent!
quelle
Ich habe diese einfache Lösung implementiert, die für mich funktioniert (noch nicht in der Produktionsumgebung):
Ich habe eine kleine Datei, in der sich die HTML-Dateien befinden:
"versio.txt":
Diese Funktion wird auf allen meinen Seiten aufgerufen. Wenn Sie sie laden, wird überprüft, ob der Versionswert von localStorage niedriger als die aktuelle Version ist, und a
... um das Neuladen vom Server statt vom Cache zu erzwingen.
(Natürlich können Sie anstelle von localStorage Cookies oder anderen dauerhaften Client-Speicher verwenden.)
Ich habe mich wegen der Einfachheit für diese Lösung entschieden, da nur das Verwalten einer einzelnen Datei "versio.txt" das Neuladen der gesamten Site erzwingt.
Die queryString-Methode ist schwer zu implementieren und wird auch zwischengespeichert (wenn Sie von Version 1.1 zu einer früheren Version wechseln, wird sie aus dem Cache geladen, bedeutet dies, dass der Cache nicht geleert wird und alle vorherigen Versionen im Cache bleiben).
Ich bin ein kleiner Neuling und würde Ihre professionelle Überprüfung und Überprüfung schätzen, um sicherzustellen, dass meine Methode ein guter Ansatz ist.
Ich hoffe es hilft.
quelle
Zusätzlich zum Festlegen der Cache-Steuerung: kein Cache sollten Sie den Expires-Header auf -1 setzen, wenn die lokale Kopie jedes Mal aktualisiert werden soll (einige Versionen des IE scheinen dies zu erfordern).
Siehe HTTP-Cache - Fragen Sie beim Server nach und senden Sie immer If-Modified-Since
quelle
Es gibt einen Trick, der verwendet werden kann. Der Trick besteht darin, einen Parameter / eine Zeichenfolge an den Dateinamen im Skript-Tag anzuhängen und ihn zu ändern, wenn Sie Änderungen an der Datei vornehmen.
<script src="myfile.js?version=1.0.0"></script>
Der Browser interpretiert die gesamte Zeichenfolge als Dateipfad, obwohl was nach dem "?" sind Parameter. Jetzt passiert also, dass Sie beim nächsten Aktualisieren Ihrer Datei einfach die Nummer im Skript-Tag auf Ihrer Website ändern (Beispiel
<script src="myfile.js?version=1.0.1"></script>
) und jeder Benutzerbrowser sieht, dass sich die Datei geändert hat, und holt sich eine neue Kopie.quelle
Browser zwingen, den Cache zu leeren oder korrekte Daten neu zu laden? Ich habe die meisten der im Stackoverflow beschriebenen Lösungen ausprobiert, einige funktionieren, aber nach einer Weile wird der Cache irgendwann zwischengespeichert und das zuvor geladene Skript oder die zuvor geladene Datei angezeigt. Gibt es eine andere Möglichkeit, den Cache zu leeren (CSS, JS usw.) und tatsächlich in allen Browsern zu funktionieren?
Bisher habe ich festgestellt, dass bestimmte Ressourcen einzeln neu geladen werden können, wenn Sie Datum und Uhrzeit Ihrer Dateien auf dem Server ändern. "Cache leeren" ist nicht so einfach wie es sein sollte. Anstatt den Cache in meinen Browsern zu leeren, wurde mir klar, dass durch "Berühren" der zwischengespeicherten Serverdateien Datum und Uhrzeit der auf dem Server zwischengespeicherten Quelldatei (auf Edge, Chrome und Firefox getestet) geändert werden und die meisten Browser automatisch die meisten herunterladen Aktuelle neue Kopie von dem, was sich auf Ihrem Server befindet (Code, Grafiken und Multimedia-Inhalte). Ich schlage vor, Sie kopieren einfach die aktuellsten Skripte auf den Server und "do the touch thing" -Lösung, bevor Ihr Programm ausgeführt wird. Dadurch wird das Datum aller Ihrer Problemdateien auf das aktuellste Datum und die aktuellste Uhrzeit geändert und anschließend eine neue Kopie heruntergeladen zu Ihrem Browser:
dann ... der Rest Ihres Programms ...
Ich habe einige Zeit gebraucht, um dieses Problem zu beheben (da viele Browser unterschiedlich auf verschiedene Befehle reagieren, aber alle die Uhrzeit der Dateien überprüfen und mit Ihrer heruntergeladenen Kopie in Ihrem Browser vergleichen, wenn Datum und Uhrzeit unterschiedlich sind, wird die Aktualisierung durchgeführt) kann nicht den vermeintlich richtigen Weg gehen, es gibt immer eine andere brauchbare und bessere Lösung dafür. Beste Grüße und viel Spaß beim Zelten. Übrigens touch (); oder Alternativen funktionieren in vielen Programmiersprachen, einschließlich in Javascript bash sh php, und Sie können sie in HTML einschließen oder aufrufen.
quelle
Möchten Sie den Cache leeren oder nur sicherstellen, dass Ihre aktuelle (geänderte?) Seite nicht zwischengespeichert ist?
Wenn letzteres der Fall ist, sollte es so einfach sein wie
quelle