Comment vider le cache du navigateur par programmation?

121

Je recherche un moyen de vider par programmation le cache du navigateur. Je fais cela parce que l'application met en cache des données confidentielles et j'aimerais les supprimer lorsque vous appuyez sur "se déconnecter". Cela se produirait via le serveur ou JavaScript. Bien sûr, l'utilisation du logiciel sur un ordinateur étranger / public est toujours déconseillée car il y a plus de dangers comme les enregistreurs de frappe que vous ne pouvez tout simplement pas vaincre au niveau du logiciel.

La tour
la source
3
Quels navigateurs? Vous devriez également chercher à dire au navigateur ce qu'il ne faut pas mettre en cache du serveur plutôt que d'essayer de l'effacer.
Mech Software
Vous pouvez également consulter ce didacticiel sur la mise en cache et son fonctionnement. mnot.net/cache_docs couvre les en-têtes de contrôle du cache et des trucs comme ça
scrappedcola
@MechSoftware Je veux mettre en cache pour des chargements de page plus rapides, mais je veux l'effacer après la déconnexion. De préférence, le meilleur support de navigateur possible.
Tour du
2
@rFactor Personne n'utiliserait un navigateur permettant aux sites Web de contrôler son cache.
NullUserException
3
Les sites Web de facto contrôlent le cache, car ils contrôlent les en-têtes HTTP.
Danubian Sailor

Réponses:

38

C'est possible, vous pouvez simplement utiliser jQuery pour remplacer la `` balise meta '' qui fait référence à l'état du cache par un gestionnaire / bouton d'événements, puis actualiser, facile,

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

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

REMARQUE: cette solution repose sur le cache d'application qui est implémenté dans le cadre de la spécification HTML 5. Il nécessite également une configuration de serveur pour configurer le manifeste App Cache. Il ne décrit pas une méthode par laquelle on peut effacer le cache du navigateur «traditionnel» via un code côté client ou serveur, ce qui est pratiquement impossible à faire.

Zeal Murapa
la source
S'agit-il uniquement d'une fonctionnalité HTML5?
John Naegle
Je dirais que oui, et je pense que cela nécessite également une configuration du serveur (pour configurer le manifeste de cache d'application). Bien que cette réponse offre une solution à la question initiale, elle masque le fait qu'il est quasiment impossible de vider le cache du navigateur traditionnel via un code côté client ou serveur.
Eric Fuller
Cette méthode semble contourner le cache et mettre à jour le contenu, mais lorsque la page est rechargée, elle revient au contenu précédemment mis en cache.
Simpler
obsolète en faveur des
techniciens
2
les techniciens de service ne fonctionnent pas sur les iPhones, vous devez donc utiliser le cache de l'application là
tony
159

Il n'y a aucun moyen qu'un navigateur vous laisse vider son cache. Ce serait un énorme problème de sécurité si cela était possible. Cela pourrait être très facilement abusé - la minute où un navigateur prend en charge une telle «fonctionnalité» sera la minute où je la désinstalle de mon ordinateur.

Ce que vous pouvez faire est de lui dire de ne pas mettre en cache votre page, en envoyant les en-têtes appropriés ou en utilisant ces balises meta:

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

Vous pouvez également envisager de désactiver la saisie semi-automatique sur les champs de formulaire, même si j'ai bien peur qu'il existe un moyen standard de le faire ( voir cette question ).

Quoi qu'il en soit, je tiens à souligner que si vous travaillez avec des données sensibles, vous devez utiliser SSL. Si vous n'utilisez pas SSL, toute personne ayant accès au réseau peut détecter le trafic réseau et voir facilement ce que voit votre utilisateur.

En utilisant le protocole SSL permet également certains navigateurs n'utilisent la mise en cache , sauf si explicitement dit. Voir cette question .

NullUserException
la source
8
Pourquoi vider le cache de mon application Web pour ennuyer mes utilisateurs? Je veux faire cela pour effacer les traces des données privées mises en cache. Si je dis au navigateur de ne pas mettre en cache, il doit demander des mégaoctets de données côté client à chaque fois que la page se charge, ce que je ne veux pas non plus.
Tour
27
personne ne le ferait, car évidemment ce ne serait pas possible. Tout comme vous ne pouvez pas exécuter de scripts sur une autre origine, cela ne signifie pas que vous ne pouvez pas exécuter de script sur votre origine. Si vous ne pouvez pas vider le cache sur une origine distante, c'est logique, mais pourquoi ne pourrais-je pas effacer le cache de l'origine que j'exécute le code? Il n'y a aucune raison de ne pas le faire, alors je cherche s'il y a une solution à cela, mais il semble que ce ne soit pas possible. Si vous êtes si curieux, je peux vous dire que j'ai une grande application avec beaucoup de CSS, HTML et JS compilés à environ 6 Mo.
Tour du
4
@rFactor C'est vraiment trop.
NullUserException
14
Veuillez expliquer comment, quelle que soit la mise en œuvre, ce serait un problème de sécurité. Cela pourrait être mis en œuvre en toute sécurité.
Dan
22
Peut-être que je n'ai pas assez dormi la nuit dernière, en quoi serait-ce un problème de sécurité, lorsqu'une application Web pourrait effacer ( ne pas modifier ) le cache? Comment pourriez-vous exploiter cela?
Volker E.
19

utilisez html lui-même. Il y a une astuce qui peut être utilisée. L'astuce consiste à ajouter un paramètre / une chaîne au nom de fichier dans la balise de script et de le modifier lorsque vous modifiez le fichier.

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

Le navigateur interprète la chaîne entière comme le chemin du fichier même si ce qui vient après le "?" sont des paramètres. Donc, la prochaine fois que vous mettez à jour votre fichier, changez simplement le numéro dans la balise de script sur votre site Web (exemple <script src="myfile.js?version=1.0.1"></script>) et le navigateur de chaque utilisateur verra que le fichier a changé et en récupérera une nouvelle copie.

Joish
la source
1
pour ceux qui utilisent un langage dynamique côté serveur, si vous pouvez accéder au fichier ctime, (ou mtime), vous pouvez simplement ajouter ledit temps derrière. Par exemple en php, myfile.js?v=<?=filectime('myfile.js');?>et là, vous avez un cache de mise à jour automatique pour vos ressources.
Pierre-Antoine Guillaume
J'utilisais cette technique pendant plusieurs jours. Mais j'ai remarqué aujourd'hui que le fichier est toujours rendu à partir du cache même après avoir changé la partie version. J'utilisais Chrome. Il montrait même après avoir supprimé le fichier du serveur. Quelqu'un a des informations sur la raison pour laquelle cela peut ne pas fonctionner?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ
Cette astuce fonctionne, stackoverflow.com/questions/1922910/…
Nevin
9

La meilleure idée est de créer un fichier js avec le nom + un hachage avec la version, si vous avez besoin de vider le cache, générez simplement de nouveaux fichiers avec un nouveau hachage, cela déclenchera le navigateur pour charger de nouveaux fichiers

Amiral canard
la source
5

Au départ, j'ai essayé diverses approches programmatiques dans mon html, JS pour vider le cache du navigateur. Rien ne fonctionne sur le dernier Chrome.

Enfin, je me suis retrouvé avec .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>

Testé dans Chrome, Firefox, Opera

Référence: https://wp-mix.com/disable-caching-htaccess/

rajagopalx
la source
4

location.reload (vrai); rechargera durement la page actuelle, ignorant le cache.
Cache.delete () peut également être utilisé pour les nouveaux Chrome, Firefox et Opera.

Jay Shah
la source
Cette fonction ne fonctionne pas avec Internet Explorer et le navigateur Safari. Je ne sais pas si vous travaillez avec Microsoft Edge.
Curious Developer
3

Sur Chrome, vous devriez pouvoir le faire en utilisant l'extension d'analyse comparative. Vous devez démarrer votre chrome avec les commutateurs suivants:

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

Dans la console de Chrome, vous pouvez désormais effectuer les opérations suivantes:

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

Comme vous pouvez le voir à partir des commandes ci-dessus, cela efface non seulement le cache du navigateur, mais également le cache DNS et ferme les connexions réseau. Ils sont parfaits lorsque vous effectuez une analyse comparative du temps de chargement des pages. De toute évidence, vous n'avez pas à les utiliser tous s'ils ne sont pas nécessaires (par exemple, clearCache () devrait suffire si vous avez besoin de vider le cache uniquement et que vous ne vous souciez pas du cache DNS et des connexions).

kakhkAtion
la source
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
la source
3
On ne sait pas comment cette réponse fonctionne et en quoi elle est meilleure que les nombreuses réponses existantes. Cela pourrait être grandement amélioré avec une description de l'approche que vous suivez ainsi que des documents à l'appui qui montrent pourquoi cela fonctionnera
Vlad274
Bien qu'apprécié, cela ne vide pas le cache du navigateur, cela semble casser tous les liens sur la page donnée simplement en ajoutant des paramètres.
Dan Chase
1

Vous pouvez maintenant utiliser Cache.delete ()

Exemple:

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

Fonctionne sur Chrome 40+, Firefox 39+, Opera 27+ et Edge.

r.delic
la source
0

Imaginez que les .jsfichiers sont placés dans/my-site/some/path/ui/js/myfile.js

Donc, normalement, la balise de script ressemblerait à:

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

Maintenant changez cela en:

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

Maintenant, bien sûr, cela ne fonctionnera pas. Pour que cela fonctionne, vous devez ajouter une ou quelques lignes à votre .htaccess La ligne importante est: (.htaccess entier en bas)

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

Donc, cela supprime en quelque sorte le 1111111111du chemin et les liens vers le chemin correct.

Alors maintenant, si vous faites des changements, il vous suffit de changer le numéro 1111111111 pour que vous voulez. Et quelle que soit la manière dont vous incluez vos fichiers, vous pouvez définir ce nombre via un horodatage lorsque le fichier js a été modifié pour la dernière fois. Le cache fonctionnera donc normalement si le nombre ne change pas. S'il change, il servira le nouveau fichier (OUI TOUJOURS) parce que le navigateur obtient une nouvelle URL complète et croit simplement que ce fichier est si nouveau qu'il doit aller le chercher.

Vous pouvez l' utiliser pour CSS, faviconset ce que jamais gets mis en cache. Pour CSS, utilisez simplement comme ça

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

Et cela fonctionnera! Simple à mettre à jour, simple à entretenir.

Le .htaccess complet promis

Si vous n'avez pas encore de .htaccess, c'est le minimum dont vous avez besoin:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

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