Jak programowo opróżnić pamięć podręczną przeglądarki?

121

Szukam sposobu na programowe opróżnienie pamięci podręcznej przeglądarki. Robię to, ponieważ aplikacja przechowuje poufne dane i chciałbym je usunąć po naciśnięciu "wyloguj". Może się to zdarzyć za pośrednictwem serwera lub JavaScript. Oczywiście korzystanie z oprogramowania na obcym / publicznym komputerze jest nadal odradzane, ponieważ istnieje więcej niebezpieczeństw, takich jak rejestratory kluczy, których po prostu nie można pokonać na poziomie oprogramowania.

Wieża
źródło
3
Jakie przeglądarki? Powinieneś także przyjrzeć się mówieniu przeglądarce, czego nie buforować z serwera, a nie próbować go usunąć.
Mech Software
Możesz również zapoznać się z tym samouczkiem dotyczącym buforowania i tego, jak to działa. mnot.net/cache_docs Osłony pamięci podręcznej nagłówki kontroli i takie tam
scrappedcola
@MechSoftware Chcę buforować, aby przyspieszyć ładowanie strony, ale chcę ją wyczyścić po wylogowaniu. Najlepiej jak najlepsza obsługa przeglądarek.
Tower
2
@rFactor Nikt nie używałby przeglądarki, która daje witrynom kontrolę nad pamięcią podręczną.
NullUserException
3
Faktycznie strony internetowe mają kontrolę nad pamięcią podręczną, ponieważ kontrolują nagłówki HTTP.
Danubian Sailor

Odpowiedzi:

38

Jest możliwe, możesz po prostu użyć jQuery, aby zastąpić „metatag”, który odwołuje się do stanu pamięci podręcznej, za pomocą modułu / przycisku obsługi zdarzeń, a następnie odświeżyć, łatwo,

$('.button').click(function() {
    $.ajax({
        url: "",
        context: document.body,
        success: function(s,x){

            $('html[manifest=saveappoffline.appcache]').attr('content', '');
                $(this).html(s);
        }
    }); 
});

UWAGA: To rozwiązanie opiera się na pamięci podręcznej aplikacji, która jest zaimplementowana jako część specyfikacji HTML 5. Wymaga również konfiguracji serwera w celu skonfigurowania manifestu pamięci podręcznej aplikacji. Nie opisuje metody, za pomocą której można wyczyścić „tradycyjną” pamięć podręczną przeglądarki za pomocą kodu po stronie klienta lub serwera, co jest prawie niemożliwe do zrobienia.

Zeal Murapa
źródło
Czy to tylko funkcja HTML5?
John Naegle
Powiedziałbym tak i uważam, że wymaga to również konfiguracji serwera (w celu skonfigurowania manifestu pamięci podręcznej aplikacji). Chociaż ta odpowiedź stanowi rozwiązanie pierwotnego pytania, przesłania fakt, że wyczyszczenie tradycyjnej pamięci podręcznej przeglądarki za pomocą kodu po stronie klienta lub serwera jest prawie niemożliwe.
Eric Fuller
Ta metoda wydaje się omijać pamięć podręczną i aktualizować zawartość, ale po ponownym załadowaniu strony powraca do poprzednio zbuforowanej zawartości.
Prostsze
przestarzałe na rzecz pracowników usług developer.mozilla.org/en-US/docs/Web/HTML/…
nadav
2
pracownicy usług nie pracują na iPhone'ach, więc musisz tam użyć pamięci podręcznej aplikacji
tony
159

W żaden sposób przeglądarka nie pozwoli Ci wyczyścić pamięci podręcznej. Gdyby to było możliwe, byłby to ogromny problem z bezpieczeństwem. To może być bardzo łatwo nadużywane - w chwili, gdy przeglądarka obsługuje taką „funkcję”, będzie to moment, w którym odinstaluję ją z mojego komputera.

Co można zrobić, to powiedzieć, że nie buforować stronę, przesyłając odpowiednie nagłówki lub używając następujących tagów meta:

<meta http-equiv='cache-control' content='no-cache'>
<meta http-equiv='expires' content='0'>
<meta http-equiv='pragma' content='no-cache'>

Możesz także rozważyć wyłączenie autouzupełniania pól formularza, chociaż obawiam się, że istnieje standardowy sposób ( zobacz to pytanie ).

Niezależnie od tego, chciałbym zwrócić uwagę, że jeśli pracujesz z wrażliwymi danymi, powinieneś używać SSL. Jeśli nie używasz SSL, każdy, kto ma dostęp do sieci, może podsłuchiwać ruch sieciowy i łatwo zobaczyć, co widzi Twój użytkownik.

Używanie SSL sprawia, że ​​niektóre przeglądarki nie używają buforowania, chyba że wyraźnie nakazano. Zobacz to pytanie .

NullUserException
źródło
8
Dlaczego miałbym wyczyścić pamięć podręczną mojej aplikacji internetowej, aby irytować moich użytkowników? Chcę to zrobić, aby usunąć ślady zapisanych w pamięci podręcznej prywatnych danych. Jeśli powiem przeglądarce, aby nie buforowała pamięci podręcznej, musi żądać megabajtów danych po stronie klienta za każdym razem, gdy strona się ładuje, co nie jest moim życzeniem.
Wieża
27
nikt by tego nie zrobił, bo oczywiście nie byłoby to możliwe. To, że nie możesz uruchamiać skryptów na innym źródle, nie oznacza, że ​​nie możesz uruchomić skryptu na swoim źródle. Jeśli nie możesz wyczyścić pamięci podręcznej w zdalnym źródle, jest to logiczne, ale dlaczego nie mogę wyczyścić pamięci podręcznej źródła, w którym wykonuję kod? Nie ma powodu, żeby tego nie robić, więc szukam rozwiązania, ale wygląda na to, że nie jest to możliwe. Jeśli jesteście tak ciekawi, mogę Wam powiedzieć, że mam dużą aplikację z dużą ilością CSS, HTML i JS skompilowanych do około 6 MB.
Tower
4
@rFactor To jest za dużo.
NullUserException
14
Proszę wyjaśnić, dlaczego niezależnie od implementacji, byłoby to kwestią bezpieczeństwa? Można to bezpiecznie wdrożyć.
Dan,
22
Może nie wyspałem się wczoraj w nocy, w jakim sensie byłoby to kwestią bezpieczeństwa, kiedy aplikacja internetowa mogłaby wyczyścić (a nie zmienić ) pamięć podręczną? Jak mogłeś to wykorzystać?
Volker E.
19

użyj samego html. Jest jedna sztuczka, której można użyć: sztuczka polega na dołączeniu parametru / ciągu do nazwy pliku w tagu skryptu i zmianie go, gdy dokonujesz zmian w pliku.

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

Przeglądarka interpretuje cały ciąg jako ścieżkę do pliku, nawet jeśli znajduje się on po znaku „?” są parametrami. Więc teraz dzieje się tak, że następnym razem, gdy zaktualizujesz plik, po prostu zmień numer w tagu skryptu na swojej stronie internetowej (przykład <script src="myfile.js?version=1.0.1"></script>), a przeglądarka każdego użytkownika zobaczy, że plik się zmienił i pobierze nową kopię.

Joish
źródło
1
dla tych, którzy używają jakiegoś dynamicznego języka po stronie serwera, jeśli masz dostęp do pliku ctime, (lub mtime), możesz po prostu dodać czas za nim. Na przykład w php, myfile.js?v=<?=filectime('myfile.js');?>i tam masz automatyczną aktualizację pamięci podręcznej dla swoich zasobów.
Pierre-Antoine Guillaume
Używałem tej techniki przez wiele dni. Ale dzisiaj zauważyłem, że plik jest nadal renderowany z pamięci podręcznej, nawet po zmianie części wersji. Używałem Chrome. To było widoczne nawet po usunięciu pliku z serwera. Czy ktoś ma jakieś informacje, dlaczego to może nie działać?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ
Ta sztuczka działa, stackoverflow.com/questions/1922910/ ...
Nevin
9

Najlepszym pomysłem jest wygenerowanie pliku js z nazwą + trochę skrótu z wersją, jeśli musisz wyczyścić pamięć podręczną, po prostu wygeneruj nowe pliki z nowym hashem, spowoduje to, że przeglądarka załaduje nowe pliki

Admiral Duck
źródło
5

Początkowo próbowałem różnych metod programistycznych w moim html, JS, aby wyczyścić pamięć podręczną przeglądarki. W najnowszym Chrome nic nie działa.

W końcu otrzymałem .htaccess:

<IfModule mod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>

Przetestowano w Chrome, Firefox, Opera

Źródła: https://wp-mix.com/disable-caching-htaccess/

rajagopalx
źródło
4

location.reload (true); ciężko przeładuje bieżącą stronę, ignorując pamięć podręczną.
Cache.delete () może być również używany w nowych przeglądarkach Chrome, Firefox i Opera.

Jay Shah
źródło
Ta funkcja nie działa z przeglądarką Internet Explorer i Safari. Nie jestem pewien, czy pracujesz z Microsoft Edge.
Ciekawy programista
3

W przeglądarce Chrome powinieneś to zrobić za pomocą rozszerzenia do testów porównawczych. Musisz uruchomić Chrome za pomocą następujących przełączników:

./chrome --enable-benchmarking --enable-net-benchmarking 

W konsoli Chrome możesz teraz wykonać następujące czynności:

chrome.benchmarking.clearCache();
chrome.benchmarking.clearHostResolverCache();
chrome.benchmarking.clearPredictorCache();
chrome.benchmarking.closeConnections();

Jak widać z powyższych poleceń, nie tylko czyści pamięć podręczną przeglądarki, ale także czyści pamięć podręczną DNS i zamyka połączenia sieciowe. Są świetne, gdy wykonujesz testy porównawcze czasu ładowania strony. Oczywiście nie musisz używać ich wszystkich, jeśli nie są potrzebne (np. ClearCache () powinno wystarczyć, jeśli chcesz wyczyścić tylko pamięć podręczną i nie przejmujesz się pamięcią podręczną DNS i połączeniami).

kakhkAtion
źródło
2

//The code below should be put in the "js" folder with the name "clear-browser-cache.js"

(function () {
    var process_scripts = false;
    var rep = /.*\?.*/,
    links = document.getElementsByTagName('link'),
    scripts = document.getElementsByTagName('script');
    var value = document.getElementsByName('clear-browser-cache');
    for (var i = 0; i < value.length; i++) {
        var val = value[i],
            outerHTML = val.outerHTML;
        var check = /.*value="true".*/;
        if (check.test(outerHTML)) {
            process_scripts = true;
        }
    }
    for (var i = 0; i < links.length; i++) {
        var link = links[i],
        href = link.href;
        if (rep.test(href)) {
            link.href = href + '&' + Date.now();
        }
        else {
            link.href = href + '?' + Date.now();
        }
    }
    if (process_scripts) {
        for (var i = 0; i < scripts.length; i++) {
            var script = scripts[i],
            src = script.src;
            if (src !== "") {
                if (rep.test(src)) {
                    script.src = src + '&' + Date.now();
                }
                else {
                    script.src = src + '?' + Date.now();
                }
            }
        }
    }
})();
At the end of the tah head, place the line at the code below

    < script name="clear-browser-cache" src='js/clear-browser-cache.js' value="true" >< /script >

haimirick
źródło
3
Nie jest jasne, jak działa ta odpowiedź i jak jest lepsza niż wiele istniejących odpowiedzi. Można to znacznie ulepszyć,
dodając
Chociaż jest to doceniane, nie czyści to pamięci podręcznej przeglądarki, wydaje się, że buforuje wszelkie linki na danej stronie, po prostu dodając parametry.
Dan Chase,
1

Możesz teraz używać Cache.delete ()

Przykład:

let id = "your-cache-id";
// you can find the id by going to 
// application>storage>cache storage 
// (minus the page url at the end)
// in your chrome developer console 

caches.open(id)
.then(cache => cache.keys()
  .then(keys => {
    for (let key of keys) {
      cache.delete(key)
    }
  }));

Działa na Chrome 40+, Firefox 39+, Opera 27+ i Edge.

r.delic
źródło
0

Wyobraź sobie, że .jspliki są umieszczone w/my-site/some/path/ui/js/myfile.js

Więc normalnie tag script wyglądałby tak:

<script src="/my-site/some/path/ui/js/myfile.js"></script>

Teraz zmień to na:

<script src="/my-site/some/path/ui-1111111111/js/myfile.js"></script>

Teraz oczywiście to nie zadziała. Aby to działało, musisz dodać jedną lub kilka linii do swojego .htaccess . Ważna linia to: (cały .htaccess na dole)

RewriteRule ^my-site\/(.*)\/ui\-([0-9]+)\/(.*) my-site/$1/ui/$3 [L]

Więc to, co to robi, to rodzaj usuwania 1111111111ze ścieżki i łączy do właściwej ścieżki.

Więc teraz, jeśli wprowadzisz zmiany, wystarczy zmienić liczbę 1111111111na dowolną liczbę. Jakkolwiek dołączasz swoje pliki, możesz ustawić tę liczbę za pomocą sygnatury czasowej, kiedy plik js był ostatnio modyfikowany. Więc pamięć podręczna będzie działać normalnie, jeśli liczba się nie zmieni. Jeśli się zmieni, będzie obsługiwał nowy plik (TAK ZAWSZE), ponieważ przeglądarka otrzymuje kompletny nowy adres URL i po prostu uważa, że ​​plik jest tak nowy, że musi go pobrać.

Można użyć do tego CSS, faviconsi co kiedykolwiek dostaje buforowane. W przypadku CSS po prostu użyj w ten sposób

<link href="http://my-domain.com/my-site/some/path/ui-1492513798/css/page.css" type="text/css" rel="stylesheet">

I to zadziała! Prosty w aktualizacji, prosty w utrzymaniu.

Obiecany pełny .htaccess

Jeśli nie masz jeszcze .htaccess, jest to minimum, które musisz tam mieć:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteRule ^my-site\/(.*)\/ui\-([0-9]+)\/(.*) my-site/$1/ui/$3 [L]
</IfModule>
caramba
źródło