Wymuś wyczyszczenie pamięci podręcznej

Czy jest jakiś sposób na umieszczenie kodu na mojej stronie, aby gdy ktoś odwiedza witrynę, czyści pamięć podręczną przeglądarki, aby mógł zobaczyć zmiany?

Używane języki: ASP.NET, VB.NET i oczywiście HTML, CSS i jQuery.

Author: Nhan, 2009-12-17

17 answers

Jeśli chodzi o zmiany .css i .js, jednym ze sposobów na "burzenie pamięci podręcznej" jest dodanie czegoś w rodzaju "_versionNo" do nazwy pliku dla każdego wydania. Na przykład:

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.

Lub alternatywnie zrób to po nazwie pliku:

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.
Możesz sprawdzić ten link , aby zobaczyć, jak to może działać.
 274
Author: Fermin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-23 07:24:25

Spójrz wCache-control iexpires Meta Tag.

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="EXPIRES" CONTENT="Mon, 22 Jul 2002 11:12:01 GMT">

Inną powszechną praktyką jest dołączanie ciągle zmieniających się łańcuchów na końcu żądanych plików. Na przykład:

<script type="text/javascript" src="main.js?v=12392823"></script>

 89
Author: Sampson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-17 16:26:20

Update 2012

To stare pytanie, ale myślę, że potrzebuje bardziej aktualnej odpowiedzi, ponieważ teraz istnieje sposób na większą kontrolę buforowania strony internetowej.

In Offline Web Applications (czyli tak naprawdę każda strona HTML5) applicationCache.swapCache() może być używany do aktualizacji buforowanej wersji witryny bez konieczności ręcznego przeładowywania strony.

Jest to przykład kodu z poradnika dla początkujących do korzystania z pamięci podręcznej aplikacji {[8] } w HTML5 Rocks wyjaśnienie, jak zaktualizować użytkowników do najnowszej wersji witryny:

// 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);

Zobacz także używanie pamięci podręcznej aplikacji W Sieci programistów Mozilla, aby uzyskać więcej informacji.

Aktualizacja 2016

Rzeczy szybko się zmieniają W Sieci. To pytanie zostało zadane w 2009 roku, a w 2012 roku opublikowałem Aktualizację dotyczącą nowego sposobu radzenia sobie z problemem opisanym w pytaniu. Minęły kolejne 4 lata, a teraz wydaje się, że jest już przestarzały. Podziękowania dla cgaldiolo za wskazanie go w komentarze.

Obecnie, od lipca 2016 r., standard HTML , sekcja 7.9, Offline Web applications zawiera ostrzeżenie o dezaktualizacji:

Ta funkcja jest w trakcie usuwania z platformy internetowej. (Jest to długi proces, który trwa wiele lat.) Za pomocą któregokolwiek z funkcje aplikacji internetowych offline w tej chwili jest wysoce odradza. Zamiast tego użyj pracowników serwisu.

Podobnie jak Korzystanie z pamięci podręcznej aplikacji w programie Mozilla Developer Sieć, o której wspominałem w 2012 roku:

Deprecated
Ta funkcja została usunięta ze standardów sieciowych. Chociaż niektóre przeglądarki mogą nadal go obsługiwać, jest w trakcie porzucony. Nie używaj go w starych lub nowych projektach. Strony lub aplikacje internetowe korzystanie z niego może ulec uszkodzeniu w dowolnym momencie.

Zobacz także Bug 1204581 - Dodaj powiadomienie o wycofaniu AppCache, jeśli włączone jest przechwytywanie pobierania przez pracownika usługi.

 68
Author: rsp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 22:35:28

Nie jako takie. Jedną z metod jest wysyłanie odpowiednich nagłówków podczas dostarczania treści, aby zmusić przeglądarkę do przeładowania:

Upewnij się, że strona internetowa nie jest buforowana we wszystkich przeglądarkach.

Jeśli szukasz "cache header" lub czegoś podobnego tutaj na SO, znajdziesz ASP.NET konkretne przykłady.

Innym, mniej czystym, ale czasami jedynym sposobem, jeśli nie możesz kontrolować nagłówków po stronie serwera, jest dodanie losowego parametru GET do wywoływanego zasobu:

myimage.gif?random=1923849839
 25
Author: Pekka 웃,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:03

Dla zasobów statycznych prawo buforowania byłoby używać parametrów zapytania z wartością każdego wdrożenia lub wersji pliku. Spowoduje to wyczyszczenie pamięci podręcznej po każdym wdrożeniu.

/Content/css/Site.css?version={FileVersionNumber}

Oto ASP.NET przykład MVC.

<link href="@Url.Content("~/Content/Css/Reset.css")[email protected]().Assembly.GetName().Version" rel="stylesheet" type="text/css" />

Nie zapomnij zaktualizować wersji assembly.

 13
Author: Paulius Zaliaduonis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-01 12:25:20

Miałem podobny problem i tak go rozwiązałem:

  1. W pliku index.html dodałem manifest:

    <html manifest="cache.manifest">
    
  2. W sekcji <head> zamieszczono skrypt aktualizujący pamięć podręczną:

    <script type="text/javascript" src="update_cache.js"></script>
    
  3. W sekcji <body> wstawiłem funkcję onload:

    <body onload="checkForUpdate()">
    
  4. W cache.manifest umieściłem wszystkie pliki, które chcę buforować. Ważne jest teraz, że działa w moim przypadku (Apache) po prostu aktualizując za każdym razem komentarz "wersja". Jest to również opcja nazwy plików przez"?ver= 001 " lub coś na końcu nazwy, ale to nie jest potrzebne. Zmiana tylko # version 1.01 uruchamia Zdarzenie aktualizacji pamięci podręcznej.

    CACHE MANIFEST
    # version 1.01
    style.css
    imgs/logo.png
    #all other files
    

    Ważne jest, aby uwzględnić 1., 2. i 3. punkty tylko w indeksie.html. Inaczej

    GET http://foo.bar/resource.ext net::ERR_FAILED
    

    Występuje, ponieważ każdy plik "potomny" próbuje buforować stronę, gdy strona jest już buforowana.

  5. W pliku update_cache.js umieściłem ten kod:

    function checkForUpdate()
    {
        if (window.applicationCache != undefined && window.applicationCache != null)
        {
            window.applicationCache.addEventListener('updateready', updateApplication);
        }
    }
    function updateApplication(event)
    {
        if (window.applicationCache.status != 4) return;
        window.applicationCache.removeEventListener('updateready', updateApplication);
        window.applicationCache.swapCache();
        window.location.reload();
    }
    

Teraz wystarczy zmienić pliki i w manifeście musisz zaktualizować komentarz wersji. Teraz odwiedzamy indeks.strona html zaktualizuje pamięć podręczną.

Części rozwiązania nie są moje, ale znalazłem je przez internet i poskładałem tak, aby działało.

 5
Author: Wojtek Mazurek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-18 12:53:56

Miałem sprawę, w której robiłem zdjęcia klientów online i musiałem zaktualizować div, jeśli zdjęcie zostanie zmienione. Przeglądarka nadal pokazywała stare zdjęcie. Więc użyłem hakowania wywołania zmiennej losowej GET, która byłaby unikalna za każdym razem. Tutaj jest to, czy może pomóc komukolwiek

<img src="/photos/userid_73.jpg?random=<?php echo rand() ?>" ...

Edytuj Jak zauważyli inni, śledzenie jest o wiele bardziej wydajnym rozwiązaniem, ponieważ przeładuje obrazy tylko wtedy, gdy zostaną zmienione, identyfikując tę zmianę po rozmiarze pliku:

<img src="/photos/userid_73.jpg?modified=<? filemtime("/photos/userid_73.jpg")?>"
 5
Author: zeeshan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-25 16:04:50
 2
Author: S Pangborn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:23

Nie wiem, czy to naprawdę może pomóc, ale tak powinno działać buforowanie w każdej przeglądarce. Gdy przeglądarka żąda Pliku, zawsze powinna wysłać żądanie do serwera, chyba że istnieje tryb "offline". Serwer odczyta niektóre parametry, takie jak data modified lub etags.

Serwer zwróci odpowiedź błędu 304 dla niezmodyfikowanych i przeglądarka będzie musiała użyć swojej pamięci podręcznej. Jeśli etag nie sprawdza się po stronie serwera lub data modyfikacji jest niższa od bieżącej daty modyfikacji, serwer powinien zwrócić nową zawartość z nową zmodyfikowaną datą lub etagami lub obiema.

Jeśli nie ma danych buforowania wysyłanych do przeglądarki, domyślam się, że zachowanie jest nieokreślone, przeglądarka może, ale nie musi, plik buforowania, który nie mówi, w jaki sposób są buforowane. Jeśli ustawisz parametry buforowania w odpowiedzi, spowoduje to prawidłowe buforowanie plików, a serwer może zwrócić błąd 304 lub nową zawartość.

Tak powinno się to robić. Używając losowych paramów lub numeru wersji w URL jest bardziej jak hack niż cokolwiek innego.

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/

Po przeczytaniu zobaczyłem, że jest też Data wygaśnięcia. Jeśli masz problem, być może masz ustawioną datę wygaśnięcia. Innymi słowy, gdy przeglądarka będzie buforować plik, ponieważ ma datę wygaśnięcia, nie powinna wymagać go ponownie przed tą datą. Innymi słowy, nigdy nie zapyta pliku do serwera i nigdy nie otrzyma 304 nie zmodyfikowanego. Będzie po prostu używać pamięci podręcznej do czasu osiągnięcia daty wygaśnięcia lub wyczyszczenia pamięci podręcznej.

Tak mi się wydaje, że masz jakąś datę wygaśnięcia i powinieneś użyć ostatnio zmodyfikowanych etagów lub ich kombinacji i upewnić się, że nie ma daty wygaśnięcia.

Jeśli ludzie mają tendencję do częstego odświeżania i plik nie jest zmieniany zbyt często, to może być rozsądne ustawienie dużego wygaśnięcia Data.

Moje 2 centy!

 2
Author: Loïc Faure-Lacroix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-11 19:57:23

Wiele odpowiedzi nie ma sensu - większość programistów zdaje sobie sprawę, że wyłączenie pamięci podręcznej jest nieefektywne. Istnieje jednak wiele typowych okoliczności, w których wydajność jest nieistotna, a domyślne zachowanie pamięci podręcznej jest poważnie uszkodzone.

Obejmują one zagnieżdżone, iteracyjne testowanie skryptów (ten duży!) i złamane obejścia oprogramowania stron trzecich. Żadne z podanych tutaj rozwiązań nie jest wystarczające, aby uwzględnić tak powszechne scenariusze. Większość przeglądarek internetowych jest zdecydowanie zbyt agresywne buforowanie i nie zapewnij żadnych sensownych środków, aby uniknąć tych problemów.

 2
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-10 04:32:04

Aktualizacja adresu URL do następującej wersji działa dla mnie:

/custom.js?id=1

Dodając unikalny numer po ?id= i zwiększając go o nowe zmiany, użytkownicy nie muszą naciskać CTRL + F5, aby odświeżyć pamięć podręczną. Alternatywnie, możesz dodać hash lub wersję ciągu bieżącego czasu lub epoki po ?id=

Coś jak ?id=1520606295

 2
Author: sony vizio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-20 15:30:19

Tutaj jest strona MDSN o ustawianiu buforowania w ASP.NET.

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60))
Response.Cache.SetCacheability(HttpCacheability.Public)
Response.Cache.SetValidUntilExpires(False)
Response.Cache.VaryByParams("Category") = True

If Response.Cache.VaryByParams("Category") Then
   '...
End If
 1
Author: Dave Swersky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-17 16:30:48

Zaimplementowałem to proste rozwiązanie, które działa dla mnie (jeszcze nie na środowisku produkcyjnym):

function verificarNovaVersio() {
    var sVersio = localStorage['gcf_versio'+ location.pathname] || 'v00.0.0000';
    $.ajax({
        url: "./versio.txt"
        , dataType: 'text'
        , cache: false
        , contentType: false
        , processData: false
        , type: 'post'
     }).done(function(sVersioFitxer) {
        console.log('Versió App: '+ sVersioFitxer +', Versió Caché: '+ sVersio);
        if (sVersio < (sVersioFitxer || 'v00.0.0000')) {
            localStorage['gcf_versio'+ location.pathname] = sVersioFitxer;
            location.reload(true);
        }
    });
}

Mam mały plik, w którym znajduje się html:

"Versio.txt": {]}
v00.5.0014

Ta funkcja jest wywoływana we wszystkich moich stronach, więc podczas ładowania sprawdza, czy wartość wersji localStorage jest niższa niż bieżąca wersja i wykonuje

location.reload(true);

...aby wymusić przeładowanie z serwera zamiast z pamięci podręcznej.

(Oczywiście zamiast localStorage możesz użyć plików cookie lub inne trwałe przechowywanie klienta)

Zdecydowałem się na to rozwiązanie ze względu na jego prostotę, ponieważ tylko jeden plik " versio.txt " wymusi przeładowanie całego serwisu.

Metoda queryString jest trudna do zaimplementowania i jest również buforowana (jeśli zmienisz wersję z v1.1 na poprzednią będzie ładowana z bufora, to oznacza to, że bufor nie jest spłukany, zachowując wszystkie poprzednie wersje w buforze).

Jestem trochę początkujący i chciałbym apreciate twój profesjonalny check & review, aby zapewnić moja metoda to dobre podejście.

Mam nadzieję, że to pomoże.
 1
Author: Seak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-10 09:26:36

Oprócz ustawienia Cache-control: no-cache, powinieneś również ustawić nagłówek Expires na -1, jeśli chcesz, aby lokalna kopia była odświeżana za każdym razem (niektóre wersje IE tego wymagają).

Zobacz http Cache-sprawdź z serwerem, zawsze wysyłaj If-Modified-Since

 0
Author: danben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:21

Jest jedna sztuczka, którą można użyć.Sztuczka polega na dodaniu parametru/ciągu znaków do nazwy pliku w znaczniku skryptu i zmianie go podczas zmiany pliku.

<script src="myfile.js?version=1.0.0"></script>

Przeglądarka interpretuje cały ciąg znaków jako ścieżkę do pliku, mimo że co następuje po"?"są parametrami. Tak więc Wat dzieje się teraz jest to, że następnym razem, gdy aktualizujesz plik, po prostu zmień numer w znaczniku skryptu na swojej stronie internetowej (przykład <script src="myfile.js?version=1.0.1"></script>) i każda przeglądarka użytkowników zobaczy, że plik się zmienił i chwyci nowy przyjąłem.

 0
Author: Joish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 10:40:34

Zmusić przeglądarki do wyczyszczenia pamięci podręcznej lub przeładowania poprawnych danych? próbowałem większości rozwiązań opisanych w stackoverflow, niektóre działają, ale po pewnym czasie robi Cache ostatecznie i wyświetla poprzedni załadowany skrypt lub plik. Czy istnieje inny sposób, który wyczyściłby pamięć podręczną (css, js, itp.) i faktycznie działał na wszystkich przeglądarkach?

Do tej pory odkryłem, że określone zasoby mogą być przeładowywane indywidualnie, jeśli zmienisz datę i godzinę na swoich plikach na serwerze. "Czyszczenie pamięci podręcznej" nie jest tak łatwo, jak powinno być. Zamiast wyczyścić pamięć podręczną w moich przeglądarkach, zdałem sobie sprawę, że "dotknięcie" pliki serwera buforowane faktycznie zmieni datę i godzinę pliku źródłowego buforowanego na serwerze (testowane na krawędzi, Chrome i Firefox) i większość przeglądarek automatycznie pobierze najbardziej aktualną świeżą kopię co na serwerze (kod, grafika wszelkie multimedia też). Proponuję po prostu skopiować najbardziej aktualne Skrypty na serwerze i "do the touch thing" rozwiązanie przed program uruchamia się, więc zmieni datę wszystkich problematycznych plików na najbardziej aktualną datę i godzinę, a następnie pobiera świeżą kopię do przeglądarki:

<?php
   touch('/www/sample/file1.css');
   touch('/www/sample/file2.js');
?>
Więc ... resztę programu...

Zajęło mi trochę czasu, aby rozwiązać ten problem (jak wiele przeglądarek działa inaczej do różnych poleceń, ale wszystkie sprawdzają czas plików i porównać do pobranej kopii w przeglądarce, jeśli inna data i godzina, zrobi odświeżanie), jeśli nie można przejść rzekomą właściwą drogę, jest zawsze innym użytecznym i lepszym rozwiązaniem. Pozdrawiam i życzę miłego biwaku. Przy okazji touch (); lub alternatywy działają w wielu językach programowania włącznie w javascript bash SH php i można włączyć lub wywołać je w html.

 0
Author: Lucho Cabrejo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-12 20:52:34

Czy chcesz wyczyścić pamięć podręczną, czy po prostu upewnij się, że Twój bieżący (zmieniony?) strona nie jest buforowana?

Jeśli to drugie, powinno być tak proste jak

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
 -1
Author: Tim Crone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-17 16:28:30