¿Cómo vaciar la caché del navegador mediante programación?

121

Estoy buscando una forma de vaciar programáticamente la caché del navegador. Hago esto porque la aplicación almacena en caché datos confidenciales y me gustaría eliminarlos cuando presione "cerrar sesión". Esto sucedería a través del servidor o JavaScript. Por supuesto, todavía se desaconseja el uso del software en una computadora pública o extranjera, ya que existen más peligros, como los registradores de claves, que no se pueden vencer a nivel del software.

Torre
fuente
3
¿Qué navegadores? También debe considerar decirle al navegador qué no guardar en caché del servidor en lugar de intentar borrarlo.
Mech Software
Es posible que también desee consultar este tutorial sobre el almacenamiento en caché y cómo funciona. mnot.net/cache_docs cubre los encabezados de control de caché y cosas así
scrappedcola
@MechSoftware Quiero almacenar en caché para cargas de página más rápidas, pero quiero borrarlo después de cerrar sesión. Preferiblemente, el mejor soporte de navegador posible.
Torre
2
@rFactor Nadie usaría un navegador que le dé a los sitios web control sobre su caché.
NullUserException
3
Los sitios web de facto tienen control sobre la caché, porque controlan los encabezados HTTP.
Marinero del Danubio

Respuestas:

38

Es posible, simplemente puede usar jQuery para sustituir la 'metaetiqueta' que hace referencia al estado de la caché con un controlador / botón de eventos, y luego actualizar, 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 solución se basa en la caché de la aplicación que se implementa como parte de la especificación HTML 5. También requiere la configuración del servidor para configurar el manifiesto de App Cache. No describe un método mediante el cual uno pueda borrar la caché del navegador 'tradicional' a través del código del lado del cliente o del servidor, lo cual es casi imposible de hacer.

Zeal Murapa
fuente
¿Es solo una función de HTML5?
John Naegle
Yo diría que sí, y creo que también requiere configuración del servidor (para configurar el manifiesto de caché de la aplicación). Si bien esta respuesta ofrece una solución a la pregunta original, oculta el hecho de que es casi imposible borrar la memoria caché del navegador tradicional a través del código del lado del cliente o del servidor.
Eric Fuller
Este método parece omitir el caché y actualizar el contenido, pero cuando se vuelve a cargar la página, vuelve al contenido previamente almacenado en caché.
Más simple
en desuso a favor de los trabajadores del servicio developer.mozilla.org/en-US/docs/Web/HTML/…
nadav
2
los trabajadores de servicio no trabajan en iPhones, por lo que debe usar el caché de la aplicación allí
tony
159

No hay forma de que un navegador te permita borrar su caché. Sería un gran problema de seguridad si eso fuera posible. Esto se podría abusar muy fácilmente: en el momento en que un navegador admita tal "función" será el momento en que lo desinstale de mi computadora.

Lo que puede hacer es decirle que no almacene su página en caché, enviando los encabezados apropiados o usando estas metaetiquetas:

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

Es posible que también desee considerar desactivar la función de autocompletar en los campos de formulario, aunque me temo que hay una forma estándar de hacerlo ( consulte esta pregunta ).

Independientemente, me gustaría señalar que si está trabajando con datos confidenciales, debería usar SSL. Si no está utilizando SSL, cualquier persona con acceso a la red puede rastrear el tráfico de la red y ver fácilmente lo que ve su usuario.

El uso de SSL también hace que algunos navegadores no utilicen el almacenamiento en caché a menos que se indique explícitamente que lo hagan. Vea esta pregunta .

NullUserException
fuente
8
¿Por qué debería borrar el caché de mi aplicación web para molestar a mis usuarios? Quiero hacer eso para borrar rastros de datos privados almacenados en caché. Si le digo al navegador que no almacene en caché, tiene que solicitar megabytes de datos del lado del cliente cada vez que se carga la página, lo cual no es lo que quiero hacer.
Torre
27
nadie lo haría, porque obviamente no sería posible. El hecho de que no pueda ejecutar scripts en otro origen no significa que no pueda ejecutar un script en su origen. Si no puede borrar el caché en un origen remoto, es lógico, pero ¿por qué no puedo borrar el caché del origen en el que estoy ejecutando el código? No hay razón para no hacerlo, así que estoy buscando si hay una solución para eso, pero parece que no es posible. Si tienes tanta curiosidad puedo decirte que tengo una gran aplicación con mucho CSS, HTML y JS compilado a unos 6 MB.
Torre
4
@rFactor Eso es demasiado.
NullUserException
14
Explique cómo, sin importar la implementación, esto sería un problema de seguridad. Esto podría implementarse de forma segura.
Dan
22
Tal vez no dormí lo suficiente anoche, ¿de qué manera sería un problema de seguridad, cuando una aplicación web podría borrar ( no alterar ) el caché? ¿Cómo puedes aprovechar eso?
Volker E.
19

use html mismo. Hay un truco que se puede usar. El truco es agregar un parámetro / cadena al nombre del archivo en la etiqueta del script y cambiarlo cuando cambie el archivo.

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

El navegador interpreta la cadena completa como la ruta del archivo aunque lo que viene después del "?" son parámetros. Entonces, lo que sucede ahora es que la próxima vez que actualice su archivo, simplemente cambie el número en la etiqueta de secuencia de comandos en su sitio web (ejemplo <script src="myfile.js?version=1.0.1"></script>) y el navegador de cada usuario verá que el archivo ha cambiado y tomará una nueva copia.

Joish
fuente
1
para aquellos que usan algún lenguaje dinámico del lado del servidor, si puede acceder al archivo ctime, (o mtime), puede simplemente agregar dicho tiempo detrás. Por ejemplo, en php, myfile.js?v=<?=filectime('myfile.js');?>y ahí tienes un caché de actualización automática para tus recursos.
Pierre-Antoine Guillaume
Estuve usando esta técnica durante muchos días. Pero hoy noté que el archivo todavía se está procesando desde la caché incluso después de que cambié la parte de la versión. Estaba usando Chrome. Se estaba mostrando incluso después de que eliminé el archivo del servidor. ¿Alguien tiene alguna información de por qué puede que no funcione?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ
Este truco funciona, stackoverflow.com/questions/1922910/…
Nevin
9

La mejor idea es hacer la generación de archivos js con nombre + algún hash con la versión, si necesita borrar el caché, simplemente genere nuevos archivos con un nuevo hash, esto activará el navegador para cargar nuevos archivos

Almirante pato
fuente
5

Inicialmente probé varios enfoques programáticos en mi html, JS para borrar la caché del navegador. Nada funciona en la última versión de Chrome.

Finalmente, terminé con .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>

Probado en Chrome, Firefox, Opera

Referencia: https://wp-mix.com/disable-caching-htaccess/

rajagopalx
fuente
4

location.reload (verdadero); volverá a cargar la página actual, ignorando el caché.
Cache.delete () también se puede utilizar para nuevos Chrome, Firefox y Opera.

Jay Shah
fuente
Esta función no funciona con Internet Explorer y Safari Browser. No estoy seguro de si funciona con Microsoft Edge.
Desarrollador curioso
3

En Chrome, debería poder hacer esto utilizando la extensión de evaluación comparativa. Necesitas iniciar tu Chrome con los siguientes interruptores:

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

En la consola de Chrome ahora puede hacer lo siguiente:

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

Como puede ver en los comandos anteriores, no solo borra la caché del navegador, sino que también borra la caché de DNS y cierra las conexiones de red. Son excelentes cuando se realiza una evaluación comparativa del tiempo de carga de la página. Obviamente, no tiene que usarlos todos si no los necesita (por ejemplo, clearCache () debería ser suficiente si necesita borrar solo el caché y no le importa el caché DNS y las conexiones).

kakhkAción
fuente
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
fuente
3
No está claro cómo funciona esta respuesta y cómo es mejor que las muchas respuestas existentes. Esto podría mejorarse enormemente con una descripción del enfoque que está siguiendo, así como con documentación de respaldo que muestre por qué funcionará
Vlad274
Si bien se agradece, esto no borra la memoria caché del navegador, parece almacenar en caché cualquier enlace en la página dada simplemente agregando parámetros.
Dan Chase
1

Ahora puede usar Cache.delete ()

Ejemplo:

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 en Chrome 40+, Firefox 39+, Opera 27+ y Edge.

r.delic
fuente
0

Imagina que los .jsarchivos se colocan en/my-site/some/path/ui/js/myfile.js

Entonces, normalmente, la etiqueta de secuencia de comandos se vería así:

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

Ahora cámbielo a:

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

Ahora, por supuesto, eso no funcionará. Para que funcione, debe agregar una o algunas líneas a su .htaccess La línea importante es: (.htaccess completo en la parte inferior)

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

Entonces, lo que hace es eliminar el 1111111111de la ruta y se vincula a la ruta correcta.

Así que ahora, si realiza cambios, solo tiene que cambiar el número 1111111111por el número que desee. Y, sin embargo, incluye sus archivos, puede establecer ese número a través de una marca de tiempo cuando el archivo js se modificó por última vez. Por lo tanto, el caché funcionará normalmente si el número no cambia. Si cambia, servirá el nuevo archivo (SI SIEMPRE) porque el navegador obtiene una URL completamente nueva y simplemente cree que el archivo es tan nuevo que debe ir a buscarlo.

Puede usar esto para CSS, faviconsy lo que sea que se almacene en caché. Para CSS solo usa así

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

¡Y funcionará! Simple de actualizar, simple de mantener.

El .htaccess completo prometido

Si aún no tiene .htaccess, este es el mínimo que necesita tener allí:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

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