如何以编程方式清空浏览器缓存?


121

我正在寻找一种以编程方式清空浏览器缓存的方法。我这样做是因为应用程序缓存了机密数据,当您按“注销”时,我想删除这些数据。这将通过服务器或JavaScript发生。当然,仍然不鼓励在外国/公共计算机上使用该软件,因为还有诸如键盘记录程序之类的更多危险,您无法在软件级别上克服这些危险。


3
哪些浏览器?您还应该告诉浏览器不要从服务器缓存哪些内容,以及尝试擦除它。
Mech Software

您可能还想查看有关缓存的本教程及其工作方式。mnot.net/cache_docs盖缓存控制头之类的东西
scrappedcola

@MechSoftware我想缓存以加快页面加载速度,但是我想在注销后清除它。最好是尽可能好的浏览器支持。
塔楼

2
@rFactor没有人会使用允许网站控制其缓存的浏览器。
NullUserException

3
事实上的网站可以控制缓存,因为它们控制HTTP标头。
Danubian Sailor'Feb

Answers:


38

有可能,您可以简单地使用jQuery用事件处理程序/按钮替换引用缓存状态的“元标记”,然后进行刷新,轻松,

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

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

注意:此解决方案依赖于作为HTML 5规范的一部分实现的应用程序缓存。它还需要服务器配置才能设置应用程序缓存清单。它没有描述一种可以通过客户端或服务器端代码清除“传统”浏览器缓存的方法,这几乎是不可能的。


这只是HTML5功能吗?
John Naegle 2013年

我会这样说,我相信它也需要服务器配置(以设置应用程序缓存清单)。虽然此答案为原始问题提供了解决方案,但它掩盖了几乎不可能通过客户端或服务器端代码清除传统浏览器缓存的事实。
埃里克·富勒

此方法似乎绕过了缓存并更新了内容,但是在重新加载页面时,它会返回到先前缓存的内容。
更简单的2014年


2
服务人员无法在iPhone上工作,因此您必须在该处使用应用程序缓存
Tony

159

没有办法浏览器会让你清除缓存。如果可能的话,这将是一个巨大的安全问题。这很容易被滥用-浏览器支持这种“功能”的那一刻就是我从计算机上卸载它的那一刻。

可以做的是通过发送适当的标题或使用以下元标记来告诉它不要缓存您的页面:

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

您可能还想考虑关闭表单字段上的自动完成功能,尽管恐怕有一种标准的方法(请参阅此问题)。

无论如何,我想指出的是,如果您要使用敏感数据,则应使用SSL。如果您不使用SSL,则有权访问网络的任何人都可以嗅探网络流量并轻松查看您的用户所看到的内容。

除非明确告知,否则使用SSL还会使某些浏览器使用缓存。看到这个问题


8
为什么我要清除Web应用程序的缓存来烦扰用户?我想这样做以清除缓存的私有数据的痕迹。如果我告诉浏览器不要缓存,则每次页面加载时它都必须请求兆字节的客户端数据,这都不是我想要的。
塔楼

27
没有人会这样做,因为显然不可能。就像您不能在另一个来源上运行脚本并不意味着您不能在来源上运行脚本。如果无法清除远程源上的缓存,这是合乎逻辑的,但是为什么我不能清除正在执行代码的源的缓存呢?没有理由不这样做,所以我正在寻找是否有解决方案,但似乎不可能。如果您如此好奇,我可以告诉您,我有一个大型应用程序,其中包含许多CSS,HTML和JS,它们的编译大小约为6 MB。

4
@rFactor太多了。
NullUserException

14
请说明无论实施如何,这都是安全问题?这可以安全地实现。
2014年

22
也许昨晚我没有足够的睡眠,当Web应用程序可以清除(不更改)缓存时,它将以什么方式成为安全问题?你怎么能利用它?
Volker E.

19

使用html本身。有一个技巧可以使用。该技巧是在脚本标记中的文件名后附加参数/字符串,并在文件更改时对其进行更改。

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

浏览器将整个字符串解释为文件路径,即使“?”之后是什么。是参数。因此,现在发生的麻烦是,下次更新文件时,只需更改网站上脚本标签中的数字(示例<script src="myfile.js?version=1.0.1"></script>),每个用户浏览器都将看到文​​件已更改并获取新副本。


1
对于使用某些服务器端动态语言的用户,如果可以访问文件的ctime,(或mtime),则只需在文件后面加上上述时间即可。例如,在php中,myfile.js?v=<?=filectime('myfile.js');?>您将获得一个针对资源的自动更新缓存。
皮埃尔·安东尼·纪尧姆

我已经使用这种技术很多天了。但是我今天注意到,即使更改了版本部分,文件仍仍从缓存中呈现。我正在使用Chrome。即使在我从服务器删除文件后,它仍在显示。任何人都有任何信息,为什么它可能不起作用?
TᴀʀᴇǫMᴀʜᴍᴏᴏᴅ

这个技巧有效,stackoverflow.com
questions/

9

最好的想法是使用名称+带有版本的哈希来生成js文件,如果您确实需要清除缓存,只需使用新的哈希来生成新文件,这将触发浏览器加载新文件


5

最初,我尝试在HTML,JS中使用各种编程方法来清除浏览器缓存。在最新版的Chrome上无法使用。

最后,我以.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>

在Chrome,Firefox,Opera中经过测试

参考:https : //wp-mix.com/disable-caching-htaccess/



3

在Chrome上,您应该可以使用基准测试扩展程序执行此操作。您需要使用以下开关启动chrome:

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

现在,在Chrome浏览器的控制台中,您可以执行以下操作:

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

从上面的命令可以看出,它不仅清除浏览器缓存,而且清除DNS缓存并关闭网络连接。当您执行页面加载时间基准测试时,这些功能很棒。显然,如果不需要,则不必全部使用它们(例如,如果只需要清除缓存并且不关心DNS缓存和连接,那么clearCache()就足够了)。


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 >


3
目前尚不清楚该答案的工作原理,以及它比许多现有答案如何更好。可以通过描述您所采用的方法以及支持文档来证明这种方法行之有效,从而大大改善这种情况
Vlad274 '18

赞赏的是,这不会清除浏览器缓存,它似乎只是通过添加参数来缓存破坏了给定页面上的所有链接。
丹·蔡斯

1

您现在可以使用Cache.delete()

例:

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

适用于Chrome 40 +,Firefox 39 +,Opera 27+和Edge。


0

想象一下.js文件放置在/my-site/some/path/ui/js/myfile.js

因此,通常,脚本标签如下所示:

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

现在将其更改为:

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

现在当然不行了。要使其正常工作,您需要在您.htaccess 的行中添加一行或几行。重要的行是:(整个底部是.htaccess)

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

因此,这样做是1111111111从路径中删除并链接到正确的路径。

因此,现在,如果您进行更改,则只需将数字更改1111111111为所需的任何数字即可。而且,无论您是否包含文件,都可以在上次修改js文件时通过时间戳设置该数字。因此,如果数字不变,则缓存将正常工作。如果更改,它将提供新文件(总是),因为浏览器获取的是一个完整的新URL,并且只是认为该文件是如此新,因此必须继续获取它。

你可以用这个CSSfavicons和什么都被缓存。对于CSS就像这样使用

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

它将起作用!更新简单,维护简单。

承诺的完整.htaccess

如果您还没有.htaccess,那么这是您需要具备的最低权限:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteRule ^my-site\/(.*)\/ui\-([0-9]+)\/(.*) my-site/$1/ui/$3 [L]
</IfModule>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.