Como esvaziar programaticamente o cache do navegador?

121

Estou procurando uma maneira de esvaziar programaticamente o cache do navegador. Estou fazendo isso porque o aplicativo armazena em cache dados confidenciais e gostaria de removê-los quando você pressionar "sair". Isso aconteceria via servidor ou JavaScript. Obviamente, o uso do software em computadores públicos / estrangeiros ainda é desencorajado, pois há mais perigos, como key loggers, que você simplesmente não pode derrotar no nível do software.

Torre
fonte
3
Quais navegadores? Você também deve dizer ao navegador o que não armazenar em cache no servidor e tentar apagá-lo.
Mech Software
Você também pode conferir este tutorial sobre armazenamento em cache e como ele funciona. mnot.net/cache_docs tampas armazenar em cache cabeçalhos de controle e coisas assim
scrappedcola
@MechSoftware Desejo fazer cache de carregamentos de página mais rápidos, mas desejo limpá-lo após o logoff. De preferência, o melhor suporte possível ao navegador.
Tower
2
@rFactor Ninguém usaria um navegador que dê aos sites controle sobre seu cache.
NullUserException
3
Sites de fato têm controle sobre o cache, porque eles controlam cabeçalhos HTTP.
Danubian Sailor

Respostas:

38

É possível, você pode simplesmente usar o jQuery para substituir a 'meta tag' que referencia o status do cache por um manipulador / botão de evento e, em seguida, atualizar, fácil,

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

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

NOTA: Esta solução depende do cache do aplicativo implementado como parte da especificação do HTML 5. Também requer a configuração do servidor para configurar o manifesto do App Cache. Ele não descreve um método pelo qual é possível limpar o cache do navegador "tradicional" por meio de código do lado do cliente ou do servidor, o que é quase impossível.

Zeal Murapa
fonte
Isso é apenas um recurso HTML5?
John Naegle
Eu diria que sim, e acredito que também requer configuração do servidor (para configurar o manifesto de cache do aplicativo). Embora essa resposta ofereça uma solução para a pergunta original, oculta o fato de que é quase impossível limpar o cache tradicional do navegador por meio de código do cliente ou do servidor.
Eric Fuller
Esse método parece ignorar o cache e atualizar o conteúdo, mas quando a página é recarregada, ela volta ao conteúdo armazenado em cache anteriormente.
Mais simples
descontinuado em favor dos trabalhadores do serviço developer.mozilla.org/pt-BR/docs/Web/HTML/…
nadav
2
trabalhadores de serviços não funcionam em iPhones então você tem que usar o cache de aplicativo lá
tony
159

Não há como um navegador permitir que você limpe seu cache. Seria um enorme problema de segurança se isso fosse possível. Isso pode ser facilmente abusado - no momento em que um navegador suportar esse "recurso" será o minuto em que eu o desinstalar do computador.

O que você pode fazer é dizer para não armazenar em cache sua página, enviando os cabeçalhos apropriados ou usando essas metatags:

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

Você também pode querer desativar o preenchimento automático em campos de formulário, embora eu tenha receio que exista uma maneira padrão de fazer isso ( consulte esta pergunta ).

Independentemente disso, gostaria de salientar que, se você estiver trabalhando com dados confidenciais, deverá usar SSL. Se você não estiver usando SSL, qualquer pessoa com acesso à rede poderá detectar o tráfego da rede e ver facilmente o que o usuário está vendo.

O uso do SSL também faz com que alguns navegadores não usem cache, a menos que seja explicitamente solicitado. Veja esta pergunta .

NullUserException
fonte
8
Por que limparia o cache do meu aplicativo da web para incomodar meus usuários? Eu quero fazer isso para limpar traços de dados privados em cache. Se eu disser ao navegador para não armazenar em cache, ele precisará solicitar megabytes de dados do lado do cliente toda vez que a página carregar, o que não é o que eu quero fazer.
Tower
27
ninguém o faria, porque obviamente não seria possível. Assim como você não pode executar scripts em outra origem, isso não significa que você não pode executar um script em sua origem. Se você não pode limpar o cache em uma origem remota, isso é lógico, mas por que não consegui limpar o cache da origem que estou executando o código? Não há razão para não fazê-lo, então estou procurando se há uma solução para isso, mas parece que não é possível. Se você é tão curioso, posso dizer que tenho um aplicativo grande com muito CSS, HTML e JS compilados para cerca de 6 MB.
Torre
4
@rFactor Isso é demais.
NullUserException
14
Por favor, explique como não importa a implementação, isso seria um problema de segurança? Isso pode ser implementado com segurança.
Dan
22
Talvez eu não tenha dormido o suficiente ontem à noite, de que maneira seria um problema de segurança quando um aplicativo Web pudesse limpar ( não alterar ) o cache? Como você pôde explorar isso?
Volker E.
19

use o próprio HTML. Existe um truque que pode ser usado. O truque é anexar um parâmetro / string ao nome do arquivo na tag de script e alterá-lo quando o arquivo for alterado.

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

O navegador interpreta a cadeia inteira como o caminho do arquivo, mesmo que o que vem depois do "?" são parâmetros. Então, o que acontece agora é que, na próxima vez em que você atualizar seu arquivo, altere o número na tag de script no seu site (exemplo <script src="myfile.js?version=1.0.1"></script>) e cada navegador de usuários verá que o arquivo foi alterado e pega uma nova cópia.

Joish
fonte
1
para aqueles que usam alguma linguagem dinâmica do lado do servidor, se você pode acessar o arquivo ctime(ou mtime), basta adicionar o tempo mencionado por trás dele. Por exemplo, em php,, myfile.js?v=<?=filectime('myfile.js');?>e você tem um cache de atualização automática para seus recursos.
Pierre-Antoine Guillaume
Eu estava usando essa técnica por muitos dias. Mas notei hoje que, o arquivo ainda está sendo renderizado no cache, mesmo depois de alterar a parte da versão. Eu estava usando o Chrome. Ele foi exibido mesmo depois que eu excluí o arquivo do servidor. Alguém tem alguma informação por que pode não funcionar?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ
Esse truque funciona, stackoverflow.com/questions/1922910/…
Nevin
9

A melhor idéia é fazer a geração do arquivo js com o nome + algum hash com a versão. Se você precisar limpar o cache, apenas gerar novos arquivos com o novo hash, isso ativará o navegador para carregar novos arquivos.

Almirante Pato
fonte
5

Inicialmente, tentei várias abordagens programáticas no meu html, JS para limpar o cache do navegador. Nada funciona no Chrome mais recente.

Finalmente, acabei com .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>

Testado no Chrome, Firefox, Opera

Referência: https://wp-mix.com/disable-caching-htaccess/

rajagopalx
fonte
4

location.reload (true); recarregará a página atual, ignorando o cache.
Cache.delete () também pode ser usado para o novo chrome, firefox e opera.

Jay Shah
fonte
Esta função não funciona com o Internet Explorer e o navegador Safari. Não tenho certeza se funciona com o Microsoft Edge.
Curious Developer
3

No Chrome, você deve conseguir fazer isso usando a extensão de benchmarking. Você precisa iniciar o Chrome com as seguintes opções:

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

No console do Chrome agora você pode fazer o seguinte:

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

Como você pode ver pelos comandos acima, ele não apenas limpa o cache do navegador, mas também limpa o cache do DNS e fecha as conexões de rede. Isso é ótimo quando você faz comparações de tempo de carregamento da página. Obviamente, você não precisará usá-los todos se não for necessário (por exemplo, clearCache () deve ser suficiente se você precisar limpar apenas o cache e não se importar com o cache e as conexões DNS).

kakhkAtion
fonte
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
fonte
3
Não está claro como essa resposta funciona e como é melhor que as muitas respostas existentes. Isto poderia ser muito melhorada com uma descrição do que se aproximar de você está seguindo, bem como documentação de apoio que mostra por que isso vai funcionar
Vlad274
Embora apreciado, isso não limpa o cache do navegador, parece impedir qualquer link na página fornecida apenas adicionando parâmetros.
Dan perseguição
1

Agora você pode usar Cache.delete ()

Exemplo:

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

Funciona no Chrome 40+, Firefox 39+, Opera 27+ e Edge.

r.delic
fonte
0

Imagine que os .jsarquivos são colocados em/my-site/some/path/ui/js/myfile.js

Normalmente, a tag de script seria semelhante a:

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

Agora mude isso para:

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

Agora é claro que isso não vai funcionar. Para fazê-lo funcionar, você precisa adicionar uma ou algumas linhas ao seu. .htaccess A linha importante é: (todo o .htaccess na parte inferior)

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

Então, o que isso faz é remover 1111111111o caminho e os links para o caminho correto.

Portanto, agora, se você fizer alterações, basta alterar o número 1111111111para o número que desejar. E, no entanto, ao incluir seus arquivos, você pode definir esse número através de um carimbo de data e hora quando o arquivo js foi modificado pela última vez. Portanto, o cache funcionará normalmente se o número não mudar. Se ele mudar, ele servirá o novo arquivo (SIM SEMPRE), porque o navegador obtém um novo URL completo e apenas acredita que o arquivo é tão novo que ele deve obtê-lo.

Você pode usar isso para CSS, faviconse que nunca fica armazenada em cache. Para CSS, use assim

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

E vai funcionar! Simples de atualizar, simples de manter.

O .htaccess completo prometido

Se você ainda não possui .htaccess, este é o mínimo necessário:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

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