Làm cách nào để làm trống bộ nhớ cache của trình duyệt theo chương trình?


121

Tôi đang tìm cách làm trống bộ nhớ cache của trình duyệt theo chương trình. Tôi thực hiện việc này vì ứng dụng lưu trữ dữ liệu bí mật và tôi muốn xóa những dữ liệu đó khi bạn nhấn "đăng xuất". Điều này sẽ xảy ra thông qua máy chủ hoặc JavaScript. Tất nhiên, việc sử dụng phần mềm trên máy tính công cộng / nước ngoài vẫn không được khuyến khích vì có nhiều nguy hiểm hơn như key logger mà bạn không thể đánh bại ở cấp độ phần mềm.


3
Những trình duyệt nào? Bạn cũng nên xem xét việc thông báo cho trình duyệt biết điều gì không nên lưu vào bộ nhớ cache từ máy chủ so với việc cố gắng xóa nó.
Phần mềm Mech,

Bạn cũng có thể muốn xem hướng dẫn này về Bộ nhớ đệm và cách nó hoạt động. mnot.net/cache_docs bao gồm các tiêu đề kiểm soát bộ nhớ cache và những thứ tương tự
scrappedcola

@MechSoftware Tôi muốn lưu vào bộ nhớ cache để tải trang nhanh hơn, nhưng tôi muốn xóa nó sau khi đăng xuất. Tốt nhất là hỗ trợ trình duyệt tốt nhất có thể.
Tháp

2
@rFactor Sẽ không có ai sử dụng trình duyệt cung cấp cho các trang web quyền kiểm soát bộ nhớ cache của nó.
NullUserException

3
Trên thực tế, các trang web có quyền kiểm soát bộ nhớ cache, vì chúng kiểm soát các tiêu đề HTTP.
Danubian Sailor

Câu trả lời:


38

Có thể, bạn chỉ cần sử dụng jQuery để thay thế 'thẻ meta' tham chiếu trạng thái bộ nhớ cache bằng một nút / trình xử lý sự kiện, sau đó làm mới, dễ dàng,

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

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

LƯU Ý: Giải pháp này dựa trên Bộ đệm ứng dụng được triển khai như một phần của thông số kỹ thuật HTML 5. Nó cũng yêu cầu cấu hình máy chủ để thiết lập tệp kê khai Bộ nhớ đệm ứng dụng. Nó không mô tả một phương pháp mà người ta có thể xóa bộ nhớ cache của trình duyệt 'truyền thống' thông qua mã phía máy khách hoặc phía máy chủ, điều này là không thể thực hiện được.


Đây chỉ là một tính năng HTML5?
John Naegle

Tôi sẽ nói như vậy và tôi tin rằng nó cũng yêu cầu cấu hình máy chủ (để thiết lập tệp kê khai bộ đệm ứng dụng). Mặc dù câu trả lời này đưa ra giải pháp cho câu hỏi ban đầu, nhưng nó che khuất thực tế là không thể xóa bộ nhớ cache của trình duyệt truyền thống thông qua mã phía máy khách hoặc máy chủ.
Eric Fuller

Phương pháp này dường như bỏ qua bộ nhớ cache và cập nhật nội dung, nhưng khi trang được tải lại, nó sẽ quay trở lại nội dung đã lưu trong bộ nhớ cache trước đó.
Đơn giản hơn,

không được dùng nữa để ủng hộ service
worker

2
nhân viên dịch vụ không làm việc trên iPhone nên bạn phải sử dụng bộ đệm ứng dụng ở đó
tony

159

Không có cách nào trình duyệt cho phép bạn xóa bộ nhớ cache của nó. Nó sẽ là một vấn đề bảo mật lớn nếu điều đó có thể. Điều này có thể rất dễ bị lạm dụng - phút mà trình duyệt hỗ trợ một "tính năng" như vậy sẽ là phút tôi gỡ cài đặt nó khỏi máy tính của mình.

Những gì bạn có thể làm là yêu cầu nó không lưu vào bộ nhớ cache trang của bạn, bằng cách gửi các tiêu đề thích hợp hoặc sử dụng các thẻ meta sau:

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

Bạn cũng có thể muốn xem xét việc tắt tính năng tự động hoàn thành trên các trường biểu mẫu, mặc dù tôi e rằng có một cách tiêu chuẩn để làm điều đó ( xem câu hỏi này ).

Bất kể, tôi muốn chỉ ra rằng nếu bạn đang làm việc với dữ liệu nhạy cảm, bạn nên sử dụng SSL. Nếu bạn không sử dụng SSL, bất kỳ ai có quyền truy cập vào mạng đều có thể đánh giá lưu lượng truy cập mạng và dễ dàng xem những gì người dùng của bạn đang nhìn thấy.

Việc sử dụng SSL cũng khiến một số trình duyệt không sử dụng bộ nhớ đệm trừ khi được yêu cầu rõ ràng. Xem câu hỏi này .


8
Tại sao tôi xóa bộ nhớ cache của ứng dụng web để làm phiền người dùng của mình? Tôi muốn làm điều đó để xóa dấu vết của dữ liệu cá nhân được lưu trong bộ nhớ cache. Nếu tôi yêu cầu trình duyệt không lưu vào bộ nhớ cache, nó phải yêu cầu megabyte dữ liệu phía máy khách mỗi khi tải trang, điều này tôi không muốn.
Tháp

27
không ai làm, bởi vì rõ ràng là không thể. Giống như việc bạn không thể chạy tập lệnh trên nguồn gốc khác không có nghĩa là bạn không thể chạy tập lệnh trên nguồn gốc của mình. Nếu bạn không thể xóa bộ nhớ cache trên một nguồn từ xa, điều đó hợp lý, nhưng tại sao tôi không thể xóa bộ nhớ cache của nguồn gốc mà tôi đang thực thi mã? Không có lý do gì để không làm vậy, vì vậy tôi đang tìm giải pháp cho việc đó, nhưng có vẻ như không thể. Nếu bạn tò mò, tôi có thể nói với bạn rằng tôi có một ứng dụng lớn với rất nhiều CSS, HTML và JS được biên dịch thành khoảng 6 MB.
Tháp

4
@rFactor Đó là quá nhiều.
NullUserException

14
Vui lòng giải thích cách thực hiện, đây có phải là vấn đề bảo mật không? Điều này có thể được thực hiện một cách an toàn.
Dan

22
Có lẽ tôi đã không ngủ đủ đêm qua, theo những cách nào thì đó sẽ là vấn đề bảo mật, khi một ứng dụng web có thể xóa ( không thay đổi ) bộ nhớ cache? Làm thế nào bạn có thể khai thác điều đó?
Volker E.

19

sử dụng chính html Có một thủ thuật có thể được sử dụng, đó là thêm một tham số / chuỗi vào tên tệp trong thẻ script và thay đổi nó khi bạn thay đổi tệp.

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

Trình duyệt diễn giải toàn bộ chuỗi là đường dẫn tệp mặc dù những gì đứng sau dấu "?" là các tham số. Vì vậy, điều xảy ra bây giờ là lần tới khi bạn cập nhật tệp của mình, chỉ cần thay đổi số trong thẻ script trên trang web của bạn (Ví dụ <script src="myfile.js?version=1.0.1"></script>) và mỗi trình duyệt của người dùng sẽ thấy tệp đã thay đổi và lấy một bản sao mới.


1
đối với những người sử dụng một số ngôn ngữ động phía máy chủ, nếu bạn có thể truy cập ctime(hoặc mtime) tệp , bạn chỉ cần thêm thời gian đã nói vào sau nó. Ví dụ trong php, myfile.js?v=<?=filectime('myfile.js');?>và ở đó bạn đã có cho mình một bộ đệm ẩn tự động cập nhật cho các tài nguyên của mình.
Pierre-Antoine Guillaume

Tôi đã sử dụng kỹ thuật này trong nhiều ngày. Nhưng hôm nay tôi nhận thấy rằng, tệp vẫn được hiển thị từ bộ nhớ cache ngay cả sau khi tôi thay đổi phần phiên bản. Tôi đang sử dụng Chrome. Nó vẫn hiển thị ngay cả sau khi tôi xóa tệp khỏi máy chủ. Bất cứ ai có bất kỳ thông tin tại sao nó có thể không hoạt động?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

Thủ thuật này hoạt động, stackoverflow.com/questions/1922910/…
Nevin

9

Ý tưởng tốt nhất là tạo tệp js với tên + một số hàm băm với phiên bản, nếu bạn cần xóa bộ nhớ cache, chỉ cần tạo tệp mới với hàm băm mới, điều này sẽ kích hoạt trình duyệt tải tệp mới


5

Ban đầu, tôi đã thử các cách tiếp cận có lập trình khác nhau trong html, JS của mình để xóa bộ nhớ cache của trình duyệt. Không có gì hoạt động trên Chrome mới nhất.

Cuối cùng, tôi đã kết thúc với .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>

Đã thử nghiệm trong Chrome, Firefox, Opera

Tham khảo: https://wp-mix.com/disable-caching-htaccess/


4

location.reload (true); sẽ khó tải lại trang hiện tại, bỏ qua bộ nhớ cache.
Cache.delete () cũng có thể được sử dụng cho chrome, firefox và opera mới.


Chức năng này không hoạt động với trình duyệt Internet explorer và safari. Không chắc liệu có hoạt động với Microsoft Edge hay không.
Nhà phát triển tò mò

3

Trên Chrome, bạn có thể thực hiện việc này bằng cách sử dụng tiện ích mở rộng điểm chuẩn. Bạn cần khởi động chrome của mình bằng các công tắc sau:

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

Trong bảng điều khiển của Chrome bây giờ, bạn có thể làm như sau:

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

Như bạn có thể thấy từ các lệnh trên, nó không chỉ xóa bộ nhớ cache của trình duyệt mà còn xóa bộ nhớ cache DNS và đóng các kết nối mạng. Đây là những điều tuyệt vời khi bạn thực hiện đo điểm chuẩn thời gian tải trang. Rõ ràng là bạn không phải sử dụng tất cả chúng nếu không cần thiết (ví dụ: clearCache () là đủ nếu bạn chỉ cần xóa bộ nhớ cache và không quan tâm đến bộ nhớ cache và kết nối DNS).


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
Không rõ câu trả lời này hoạt động như thế nào và nó tốt hơn câu trả lời hiện có như thế nào. Điều này có thể được cải thiện đáng kể với một mô tả về những gì tiếp cận bạn đang theo dõi cũng như hỗ trợ tài liệu cho thấy tại sao điều đó sẽ làm việc
Vlad274

Mặc dù được đánh giá cao, nhưng điều này không xóa bộ nhớ cache của trình duyệt, nó dường như phá vỡ bộ nhớ cache bất kỳ liên kết nào trên trang nhất định chỉ bằng cách thêm các tham số.
Dan Chase

1

Bây giờ bạn có thể sử dụng Cache.delete ()

Thí dụ:

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

Hoạt động trên Chrome 40+, Firefox 39+, Opera 27+ và Edge.


0

Hãy tưởng tượng các .jstệp được đặt trong/my-site/some/path/ui/js/myfile.js

Vì vậy, thông thường thẻ script sẽ giống như sau:

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

Bây giờ thay đổi điều đó thành:

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

Bây giờ tất nhiên điều đó sẽ không hoạt động. Để làm cho nó hoạt động, bạn cần thêm một hoặc một vài dòng vào .htaccess Dòng quan trọng là: (toàn bộ .htaccess ở dưới cùng)

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

Vì vậy, điều này làm là, nó loại bỏ 1111111111 đường dẫn khỏi đường dẫn và liên kết đến đường dẫn chính xác.

Vì vậy, bây giờ nếu bạn thực hiện thay đổi, bạn chỉ cần thay đổi số 1111111111thành bất kỳ số nào bạn muốn. Và tuy nhiên bạn bao gồm các tệp của mình, bạn có thể đặt số đó thông qua dấu thời gian khi tệp js được sửa đổi lần cuối. Vì vậy bộ nhớ đệm sẽ hoạt động bình thường nếu số lượng không thay đổi. Nếu nó thay đổi, nó sẽ phân phát tệp mới (CÓ LUÔN) vì trình duyệt nhận được một URL mới hoàn chỉnh và chỉ cần tin rằng tệp đó là mới nên anh ta phải đi lấy nó.

Bạn có thể sử dụng cho CSS, faviconsvà những gì từng được lưu trữ. Đối với CSS chỉ cần sử dụng như vậy

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

Và nó sẽ hoạt động! Đơn giản để cập nhật, đơn giản để bảo trì.

.Htaccess đầy đủ đã hứa

Nếu bạn chưa có .htaccess thì đây là số tiền tối thiểu bạn cần có:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteRule ^my-site\/(.*)\/ui\-([0-9]+)\/(.*) my-site/$1/ui/$3 [L]
</IfModule>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.