Wie kann ich Clients zwingen, JavaScript-Dateien zu aktualisieren?

595

Wir arbeiten derzeit in einer privaten Beta und sind daher noch dabei, ziemlich schnelle Änderungen vorzunehmen, obwohl wir diesen Prozess offensichtlich verlangsamen werden, wenn die Nutzung zunimmt. Ein Problem, auf das wir stoßen, ist jedoch, dass die Client-Browser nach dem Herausgeben eines Updates mit neuen JavaScript-Dateien immer noch die zwischengespeicherte Version der Datei verwenden und das Update nicht sehen. Natürlich können wir sie bei einem Supportanruf einfach über eine ctrlF5Aktualisierung informieren, um sicherzustellen, dass sie die aktuellen Dateien vom Server erhalten. Es wäre jedoch vorzuziehen, dies vor diesem Zeitpunkt zu erledigen.

Unser aktueller Gedanke ist, einfach eine Versionsnummer an den Namen der JavaScript-Dateien anzuhängen und dann, wenn Änderungen vorgenommen werden, die Version im Skript zu erhöhen und alle Referenzen zu aktualisieren. Dies erledigt definitiv die Arbeit, aber das Aktualisieren der Referenzen in jeder Version kann umständlich werden.

Da ich sicher bin, dass wir nicht die ersten sind, die sich damit befassen, dachte ich, ich würde es der Community vorwerfen. Wie stellen Sie sicher, dass Clients ihren Cache aktualisieren, wenn Sie Ihren Code aktualisieren? Wenn Sie die oben beschriebene Methode verwenden, verwenden Sie einen Prozess, der die Änderung vereinfacht?

AdamB
quelle

Antworten:

529

Soweit ich weiß, besteht eine übliche Lösung darin, ?<version>dem src-Link des Skripts einen hinzuzufügen .

Zum Beispiel:

<script type="text/javascript" src="myfile.js?1500"></script>

Ich gehe an dieser Stelle davon aus, dass es keinen besseren Weg als find-replace gibt, um diese "Versionsnummern" in allen Skript-Tags zu erhöhen.

Möglicherweise lässt ein Versionskontrollsystem dies für Sie tun? Die meisten Versionskontrollsysteme haben die Möglichkeit, die Versionsnummer beispielsweise beim Einchecken automatisch einzugeben.

Es würde ungefähr so ​​aussehen:

<script type="text/javascript" src="myfile.js?$$REVISION$$"></script>

Natürlich gibt es immer bessere Lösungen wie diese .

Huppie
quelle
5
Weiß jemand, ob IE7 dies ignoriert? Es scheint, die angehängten Daten zu ignorieren und die zwischengespeicherte Datei zu verwenden, wenn ich in der IE8-Vergleichbarkeitsansicht teste.
Shane Reustle
4
Ich wusste immer, dass die Abfragezeichenfolgen Schlüssel-Wert-Paare sind, wie in? Ver = 123. Vielen Dank! :)
Ankur-m
6
Ich denke, es geht nicht um eine höhere oder niedrigere Versionsnummer, sondern darum, den Wert der angehängten Variablen in etwas zu ändern, das der Browser noch nicht zwischengespeichert haben könnte.
Max Girkens
2
Wir sind kürzlich auf dasselbe Problem gestoßen, und das Beste, was ich finden konnte, war eine einfache Funktion, die "? Mod = 123456" anhängte, wobei 123456 der Unix-Zeitstempel des Änderungsdatums in der Datei war. Dies scheint die Probleme zu beheben, während das Zwischenspeichern gegebenenfalls weiterhin möglich ist. Ich habe jedoch immer noch gesehen, dass Browser diese Anweisung völlig ignorieren und trotzdem altes JS verwenden, aber ich weiß nicht, dass es eine elegante "vollständige Lösung" gibt.
VPel
31
Für das Bewusstsein: Dies wird als Hack angesehen. Diese Methode täuscht den Browser vor, dass eine neue Datei angegeben wird, da lediglich der vollständige Dateiname angezeigt wird, ohne ihn zu interpretieren. foo.js?1ist nicht der gleiche Name wie foo.js?2, daher wird der Browser annehmen, dass es sich um zwei verschiedene Dateien handelt. Ein Nachteil ist, dass beide Dateien gleichzeitig im Cache der Benutzer vorhanden sind und unnötigen Speicherplatz beanspruchen.
Lee White
88

Das Anhängen der aktuellen Uhrzeit an die URL ist in der Tat eine gängige Lösung. Sie können dies jedoch auch auf Webserverebene verwalten, wenn Sie möchten. Der Server kann so konfiguriert werden, dass verschiedene HTTP-Header für Javascript-Dateien gesendet werden.

Um beispielsweise zu erzwingen, dass die Datei nicht länger als 1 Tag zwischengespeichert wird, senden Sie Folgendes:

Cache-Control: max-age=86400, must-revalidate

Wenn Sie für die Beta den Benutzer zwingen möchten, immer die neuesten Informationen zu erhalten, verwenden Sie Folgendes:

Cache-Control: no-cache, must-revalidate
Chase Seibert
quelle
3
Kannst du bitte genauer sein?
Kreker
6
Er spricht über die Header, die vom Webserver für jede Datei gesendet werden. Sollte zum Beispiel in Apache konfigurierbar sein. Ich denke, das wäre der beste Ansatz
Pierre de LESPINAY
1
Wo konfigurierst du das?
Diego
2
Für eine Entwicklungs-Webanwendung ist dies möglicherweise eine gute Lösung. Für eine Produktionssite, bei der Sie den Cache nicht für immer ungültig machen möchten, ist dies keine gute Lösung, es sei denn, Sie wissen, dass jeder Ziel-Client-Browser auf die Site gelangt ist. Ich denke dabei an eine mögliche Webserverfunktion: Passen Sie den Parameter für das maximale Alter an ein konfiguriertes Bereitstellungsdatum an. Das wäre super.
Claude Brisson
Chrome ERFORDERT diese Einstellungen, um ordnungsgemäß zwischenzuspeichern. Ohne sie wird Chrome eine Datei für immer zwischenspeichern. Mozilla verwendet einen viel vernünftigeren Standard. Weitere Informationen finden
Sie unter
42

Google Page-Speed: Fügen Sie der URL für statische Ressourcen keine Abfragezeichenfolge hinzu. Die meisten Proxys, insbesondere Squid up bis Version 3.0, speichern Ressourcen nicht mit einem "?" in ihrer URL, auch wenn in der Antwort ein Cache-control: public-Header vorhanden ist. Um das Proxy-Caching für diese Ressourcen zu aktivieren, entfernen Sie Abfragezeichenfolgen aus Verweisen auf statische Ressourcen und codieren Sie stattdessen die Parameter in die Dateinamen selbst.

In diesem Fall können Sie die Version in die URL ex: http://abc.com/ v1.2 /script.js aufnehmen und den Link zu http://abc.com/script.js mit apache mod_rewrite umleiten . Wenn Sie die Version ändern, aktualisiert der Client-Browser die neue Datei.

Hắc Huyền Minh
quelle
Ich habe das versucht? Lösung und in IE8 und ich bekomme einen Javascript-Fehler. Mod Rewrite ist eine Option, aber in den meisten Fällen haben wir nicht so viel Kontrolle über den Server. Ich würde es vorziehen, die Version in der js-Datei selbst anzuhängen oder einen Ordner für jede Version zu haben
Karthik Sankar
@ Hắc Huyền Minh: Aber wenn das Skript neu geladen werden soll, sollte es nicht aus dem Proxy-Cache neu geladen werden ...
Stefan Steiger
34

Diese Verwendung wurde abgelehnt: https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache

Diese Antwort ist nur 6 Jahre zu spät, aber ich sehe diese Antwort an vielen Stellen nicht ... HTML5 hat den Anwendungscache eingeführt , mit dem dieses Problem gelöst wird. Ich stellte fest, dass der neue Servercode, den ich schrieb, altes Javascript zum Absturz brachte, das in den Browsern der Benutzer gespeichert war, und wollte daher einen Weg finden, ihr Javascript abzulaufen. Verwenden Sie eine Manifestdatei, die folgendermaßen aussieht:

CACHE MANIFEST
# Aug 14, 2014
/mycode.js

NETWORK:
*

und generieren Sie diese Datei jedes Mal mit einem neuen Zeitstempel, wenn Benutzer ihren Cache aktualisieren sollen. Wenn Sie dies hinzufügen, wird der Browser nicht neu geladen (selbst wenn ein Benutzer die Seite aktualisiert), bis das Manifest dies anweist.

amos
quelle
Diese Lösung ist wirklich gut, solange Sie daran denken, die Manifestdatei zu aktualisieren :)
Mattis
24
Bitte lesen Sie die Dokumentation, da diese Funktion aus den Webstandards developer.mozilla.org/en-US/docs/Web/HTML/… entfernt wurde
Flavia Obreja
1
FWIW, ich habe diese Lösung letztendlich nicht verwendet. Es war viel einfacher, den ?<version> Ansatz zu verwenden / beizubehalten .
Amos
28

Wie wäre es mit dem Hinzufügen der Dateigröße als Ladeparameter?

<script type='text/javascript' src='path/to/file/mylibrary.js?filever=<?=filesize('path/to/file/mylibrary.js')?>'></script>

Jedes Mal, wenn Sie die Datei aktualisieren, ändert sich der Parameter "filever".

Wie wäre es, wenn Sie die Datei aktualisieren und Ihre Aktualisierungsergebnisse dieselbe Dateigröße haben? Was sind die Chancen?

Erik Corona
quelle
4
Dies verwendet PHP-Tags und wenn man PHP verwendet, ist es in der Tat eine gute Idee.
Jerther
1
Ich denke, das Hinzufügen der geänderten Version wäre besser als die Dateigröße :)
Mazz
2
Mein erster Gedanke ist, anstelle der Version einen Hash der Datei hinzuzufügen.
Mike Cheel
Ich gehe davon aus, dass es auch funktioniert, wenn man einen Zeitstempel Unix hinzufügt, oder? zB '... file.js? filever = <? = time ()?>
garanda
3
Mit filemtime ($ file) wird der Zeitstempel der Datei ausgegeben. Mit time () können Sie den Cache nicht verwenden, da er sich alle Sekunden ändert.
Neoteknic
19

Nicht alle Browser zwischenspeichern Dateien mit '?' drin. Was ich getan habe, um sicherzustellen, dass es so weit wie möglich zwischengespeichert wurde, habe ich die Version in den Dateinamen aufgenommen.

Also stuff.js?123tat ich es stattdessenstuff_123.js

Ich habe mod_redirect(glaube ich) in Apache verwendet, um have stuff_*.jszu gehenstuff.js

Echo sagt Reinstate Monica
quelle
Könnten Sie bitte näher erläutern, was Sie in .htaccess mit mod_redirect getan haben?
Venkat D.
3
Eine ausführliche Erklärung dieser Methode finden Sie unter indicletree.com/notebook/…
Karl Bartel
3
Es wäre großartig, wenn Sie Ihren .htaccessCode zur späteren Bezugnahme in Ihre Antwort aufnehmen könnten.
Fizzix
1
Welcher Browser speichert Dateien nicht mit "?" drin?
rosell.dk
13

Für ASP.NET-Seiten verwende ich Folgendes

VOR

<script src="/Scripts/pages/common.js" type="text/javascript"></script>

AFTER (Nachladen erzwingen)

<script src="/Scripts/pages/common.js?ver<%=DateTime.Now.Ticks.ToString()%>" type="text/javascript"></script>

Das Hinzufügen von DateTime.Now.Ticks funktioniert sehr gut.

Ravi Ram
quelle
31
Dieser geht gegen alle Caching-Mechanismen auf der Client-Seite. Dummy-Parameter sollten durch etwas wie "{Hauptversion} _ {Nebenversion} _ {Build-Nummer} _ {Revision} ersetzt werden, das für jede Version eindeutig wäre.
Tohid
14
Während dies wahrscheinlich eine gute Lösung in einer Entwicklungsumgebung ist, ist es nicht für die Produktion geeignet. Dadurch wird der Cache bei jedem Laden der Seite für die Datei vollständig deaktiviert . Stellen Sie sich 10.000 Seiten pro Tag mit einer 50-KB-Datei vor, die täglich 500 MB Javascript-Datei darstellt.
PhilDulac
@PhilDulac Sie können es von Ticks ändern, um beispielsweise den Zeichenfolgenwert des Tages, des Monats oder der Woche des Monats zurückzugeben. Letztendlich zeigt es Ihnen nur, wie man den? V-Ansatz verwendet
Alex
3
@alex In der Tat. Ich wollte nur warnen, dass wenn die in der Antwort gezeigte Verwendung den Weg zur Produktion findet, dies Auswirkungen haben kann, die sich in der Entwicklung nicht zeigen.
PhilDulac
2
Eine Möglichkeit, um sicherzustellen, dass neue Kopien einmal täglich geladen werden, besteht darin, den Typ '<script src = "/ Scripts / pages / common.js? Ver <% = DateTime.Now.ToString (" yyyyMMdd ")%>" zu verwenden = "text / javascript"> </ script> '. Es wird also einmal am Anfang des Tages geladen und dann zwischengespeichert.
Robb Sadler
7

Für ASP.NET nehme ich die nächste Lösung mit erweiterten Optionen an (Debug- / Release-Modus, Versionen):

Auf diese Weise enthaltene Js- oder CSS-Dateien:

<script type="text/javascript" src="Scripts/exampleScript<%=Global.JsPostfix%>" />
<link rel="stylesheet" type="text/css" href="Css/exampleCss<%=Global.CssPostfix%>" />

Global.JsPostfix und Global.CssPostfix werden in Global.asax folgendermaßen berechnet:

protected void Application_Start(object sender, EventArgs e)
{
    ...
    string jsVersion = ConfigurationManager.AppSettings["JsVersion"];
    bool updateEveryAppStart = Convert.ToBoolean(ConfigurationManager.AppSettings["UpdateJsEveryAppStart"]);
    int buildNumber = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Revision;
    JsPostfix = "";
#if !DEBUG
    JsPostfix += ".min";
#endif      
    JsPostfix += ".js?" + jsVersion + "_" + buildNumber;
    if (updateEveryAppStart)
    {
        Random rand = new Random();
        JsPosfix += "_" + rand.Next();
    }
    ...
}
Ivan Kochurkin
quelle
Ich benutze .Ticks (siehe meine Antwort auf dieser Seite)
Ravi Ram
5

Heutzutage ist es üblich, einen Inhalts-Hash-Code als Teil des Dateinamens zu generieren, um den Browser, insbesondere den IE, zu zwingen, die Javascript- oder CSS-Dateien neu zu laden.

Zum Beispiel,

Verkäufer. a7561fb0e9a071baadb9 .js
main. b746e3eb72875af2caa9 .js

Es ist im Allgemeinen die Aufgabe für die Build-Tools wie Webpack. Hier finden Sie weitere Informationen, wenn jemand ausprobieren möchte, ob Sie ein Webpack verwenden.

Schrödingers Code
quelle
4

Wenn Sie die Seite generieren, die auf die JS-Dateien verweist, hängt eine einfache Lösung den Zeitstempel der letzten Änderung der Datei an die generierten Links an.

Dies ist der Antwort von Huppie sehr ähnlich, funktioniert jedoch in Versionskontrollsystemen ohne Schlüsselwortersetzung. Es ist auch besser, als die aktuelle Zeit anzuhängen, da dies das Caching verhindern würde, selbst wenn sich die Datei überhaupt nicht geändert hätte.


quelle
Ich mag diese Lösung, da sie am einfachsten zu warten ist. Wenn Sie eine .js-Datei aktualisieren, ist dies alles, was Sie tun müssen. Sie müssen auch keine Verweise auf die Datei aktualisieren, da Ihr Code den zuletzt aktualisierten Zeitstempel automatisch hinzufügt.
NL3294
3

Die jQuery-Funktion getScript kann auch verwendet werden, um sicherzustellen, dass eine js-Datei tatsächlich jedes Mal geladen wird, wenn die Seite geladen wird.

So habe ich es gemacht:

$(document).ready(function(){
    $.getScript("../data/playlist.js", function(data, textStatus, jqxhr){
         startProgram();
    });
});

Überprüfen Sie die Funktion unter http://api.jquery.com/jQuery.getScript/

Standardmäßig setzt $ .getScript () die Cache-Einstellung auf false. Dadurch wird ein zeitgestempelter Abfrageparameter an die Anforderungs-URL angehängt, um sicherzustellen, dass der Browser das Skript bei jeder Anforderung herunterlädt.

Michael Franz
quelle
8
Wir müssen Dateien zwischenspeichern, wenn keine Änderungen vorgenommen werden.
Leo Lee
3

In PHP :

function latest_version($file_name){
    echo $file_name."?".filemtime($_SERVER['DOCUMENT_ROOT'] .$file_name);
}

In HTML :

<script type="text/javascript" src="<?php latest_version('/a-o/javascript/almanacka.js'); ?>">< /script>

Wie es funktioniert:

Schreiben filepathSie in HTML den Namen und wie gewohnt, jedoch nur in die Funktion. PHP ruft die filetimeDatei ab und gibt die filepath+name+"?"+timeletzte Änderung zurück

user1944129
quelle
3

Wir haben ein SaaS für Benutzer erstellt und ihnen ein Skript zum Anhängen auf ihrer Website-Seite bereitgestellt. Es war nicht möglich, eine Version mit dem Skript anzuhängen, da der Benutzer das Skript für Funktionen an seine Website anfügt und ich sie nicht erzwingen kann um die Version jedes Mal zu ändern, wenn wir das Skript aktualisieren

Daher haben wir eine Möglichkeit gefunden, die neuere Version des Skripts jedes Mal zu laden, wenn der Benutzer das ursprüngliche Skript aufruft

Der Skriptlink, der dem Benutzer zur Verfügung gestellt wird

<script src="https://thesaasdomain.com/somejsfile.js" data-ut="user_token"></script>

die Skriptdatei

if($('script[src^="https://thesaasdomain.com/somejsfile.js?"]').length !== 0) {
   init();
} else {
   loadScript("https://thesaasdomain.com/somejsfile.js?" + guid());
}

var loadscript = function(scriptURL) {
   var head = document.getElementsByTagName('head')[0];
   var script = document.createElement('script');
   script.type = 'text/javascript';
   script.src = scriptURL;
   head.appendChild(script);
}

var guid = function() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
}

var init = function() {
    // our main code
}

Erläuterung:

Der Benutzer hat das ihm auf seiner Website bereitgestellte Skript angehängt, und wir haben mithilfe des jQuery-Selektors überprüft, ob das mit dem Skript verknüpfte eindeutige Token vorhanden ist oder nicht. Wenn nicht, wird es dynamisch mit einem neueren Token (oder einer neueren Version) geladen.

Dies bedeutet, dass dasselbe Skript zweimal aufgerufen wird, was ein Leistungsproblem sein kann. Es löst jedoch das Problem, dass das Skript nicht aus dem Cache geladen werden muss, ohne die Version in den tatsächlichen Skriptlink einzufügen, der dem Benutzer oder Client zugewiesen wurde

Haftungsausschluss: Nicht verwenden, wenn die Leistung in Ihrem Fall ein großes Problem darstellt.

Aman Singh
quelle
2

In asp.net mvc können Sie @ DateTime.UtcNow.ToString () für die Versionsnummer der js-Datei verwenden. Die Versionsnummer ändert sich automatisch mit dem Datum und Sie zwingen den Client-Browser, die js-Datei automatisch zu aktualisieren. Ich benutze diese Methode und das funktioniert gut.

<script src="~/JsFilePath/[email protected]()"></script>
Drachen
quelle
Wie bei anderen Lösungsvorschlägen wird die Datei dadurch nie zwischengespeichert, was normalerweise unerwünscht ist. Solange keine Änderungen an der Datei vorgenommen wurden, soll der Client wahrscheinlich die zwischengespeicherte Version verwenden, anstatt die unveränderte Datei jedes Mal erneut herunterzuladen.
Philip Stratford
Sie können den folgenden Code für Ihren Grund verwenden: Cache-Datei mit der Versionsnummer <script src = "~/JsFilePath/JsFile.js?v=@GetAppVersionNumber ()"> </ script>
Dragonal
2

location.reload (true);

Siehe https://www.w3schools.com/jsref/met_loc_reload.asp

Ich rufe diese Codezeile dynamisch auf, um sicherzustellen, dass Javascript nicht vom Cache des Browsers, sondern vom Webserver erneut abgerufen wurde, um diesem Problem zu entgehen.

Megan
quelle
Durch Hinzufügen des onload="location.reload();"Formulars zu meinem Formular kann ich das neue JS nach einer Aktualisierung abrufen, anstatt meine Seite neu zu starten. Dies ist eine weitaus elegantere Lösung. Vielen Dank!
ZX9
Vielen Dank, könnte dies mit einer Überprüfung verwenden, ob die IP erkannt wird, aber seit dem letzten Update nicht mehr zum Anmelden verwendet wurde. Führen Sie dies auf der Indexseite nach der ersten Anmeldung des Benutzers durch.
Fi Horan
onload = "location.reload (true);" Die oben nicht für mich arbeiten (mit Kolben und die aktuelle Version von Chrome) auch: w3schools.com/jsref/met_loc_reload.asp
aspiringGuru
1

Eine Lösung besteht darin, beim Abrufen der Ressource eine Abfragezeichenfolge mit einem Zeitstempel an die URL anzuhängen. Dies nutzt die Tatsache aus, dass ein Browser keine Ressourcen zwischenspeichert, die von URLs mit darin enthaltenen Abfragezeichenfolgen abgerufen werden.

Sie möchten wahrscheinlich nicht, dass der Browser diese Ressourcen überhaupt nicht zwischenspeichert. Es ist wahrscheinlicher, dass Sie möchten, dass sie zwischengespeichert werden, aber Sie möchten, dass der Browser eine neue Version der Datei abruft, wenn sie verfügbar ist.

Die häufigste Lösung scheint darin zu bestehen, einen Zeitstempel oder eine Revisionsnummer in den Dateinamen selbst einzubetten. Dies ist etwas mehr Arbeit, da Ihr Code geändert werden muss, um die richtigen Dateien anzufordern. Dies bedeutet jedoch, dass z. B. Version 7 von snazzy_javascript_file.js(dh snazzy_javascript_file_7.js) im Browser zwischengespeichert wird, bis Sie Version 8 veröffentlichen, und Ihr Code dann in geändert wird snazzy_javascript_file_8.jsstattdessen holen .

Richard Turner
quelle
1

Der Vorteil der Verwendung von a file.js?V=1über a fileV1.jsbesteht darin, dass Sie nicht mehrere Versionen der JavaScript-Dateien auf dem Server speichern müssen.

Das Problem, das ich sehe, file.js?V=1ist, dass Sie möglicherweise abhängigen Code in einer anderen JavaScript-Datei haben, der bei Verwendung der neuen Version der Bibliotheksdienstprogramme beschädigt wird.

Aus Gründen der Abwärtskompatibilität ist es meiner Meinung nach viel besser, diese jQuery.1.3.jsfür Ihre neuen Seiten zu verwenden und vorhandene Seiten zu verwenden jQuery.1.1.js, bis Sie bereit sind, die älteren Seiten bei Bedarf zu aktualisieren.


quelle
1

Verwenden Sie eine Versionsvariable GET, um das Zwischenspeichern des Browsers zu verhindern.

Das Anhängen ?v=AUTO_INCREMENT_VERSIONan das Ende Ihrer URL verhindert das Zwischenspeichern von Browsern und vermeidet alle zwischengespeicherten Skripte.

Derek Adair
quelle
1

Mein Kollege hat gerade einen Verweis auf diese Methode gefunden, nachdem ich (in Bezug auf CSS) unter http://www.stefanhayden.com/blog/2006/04/03/css-caching-hack/ gepostet habe . Gut zu sehen, dass andere es benutzen und es scheint zu funktionieren. Ich gehe an dieser Stelle davon aus, dass es keinen besseren Weg gibt als find-replace, um diese "Versionsnummern" in allen Skript-Tags zu erhöhen.

AdamB
quelle
1

Cache-Busting in ASP.NET Core über einen Tag-Helper erledigt dies für Sie und ermöglicht Ihrem Browser, zwischengespeicherte Skripte / CSS zu behalten, bis sich die Datei ändert. Fügen Sie einfach den Tag-Helfer asp-append-version = "true" zu Ihrem Skript- (js) oder Link-Tag (css) hinzu:

<link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true"/>

Dave Paquette hat hier (unten auf der Seite) ein gutes Beispiel und eine Erklärung für das Cache-Busting

Ccherwin
quelle
Funktioniert dies nicht in normalem ASP.NET? Ich habe versucht, die asp-append-Version zu meinem Skript-Tag hinzuzufügen, und der Browser sieht nur das Skript-Tag genau so, wie es in der Quelle angezeigt wird, einschließlich des Attributs asp-append-version.
Tolsen64
Dies ist ein .NET Core-Attribut, das Tag-Helfern zugeordnet ist. Es fügt den Skriptnamen mit einer Version hinzu, so dass der Server / Browser immer die neueste Version und Downloads sieht
ccherwin
0

Einfachste Lösung? Lassen Sie den Browser überhaupt nicht zwischenspeichern. Fügen Sie die aktuelle Zeit (in ms) als Abfrage hinzu.

(Sie befinden sich noch in der Beta-Phase, daher können Sie einen vernünftigen Grund dafür angeben, die Leistung nicht zu optimieren. Aber YMMV hier.)

pcorcoran
quelle
13
IMHO ist dies eine schlechte Lösung. Was ist, wenn Sie nicht in BETA sind und ein wichtiges Update veröffentlichen?
d -_- b
0

Ein einfacher Weg. Bearbeiten Sie htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} \.(jpe?g|bmp|png|gif|css|js|mp3|ogg)$ [NC]
RewriteCond %{QUERY_STRING} !^(.+?&v33|)v=33[^&]*(?:&(.*)|)$ [NC]
RewriteRule ^ %{REQUEST_URI}?v=33 [R=301,L]
Goran Siriev
quelle
Dies führt zu einer Umleitung, die in Bezug auf die Leistung eine suboptimale, aber funktionierende Lösung darstellt.
zweimal
0

Unten hat bei mir funktioniert:

<head>
<meta charset="UTF-8">
<meta http-equiv="cache-control" content="no-cache, must-revalidate, post-check=0, pre-check=0" />
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
</head>
H. Ostwal
quelle