Buộc trình duyệt xóa bộ nhớ cache


283

Có cách nào để tôi có thể đặt một số mã trên trang của mình để khi ai đó truy cập vào một trang web, nó sẽ xóa bộ nhớ cache của trình duyệt để họ có thể xem các thay đổi?

Ngôn ngữ được sử dụng: ASP.NET, VB.NET và tất nhiên là HTML, CSS và jQuery.


Một giải pháp hay giải pháp tốt cho "xóa bộ nhớ cache" có thể được tìm thấy ở đây: stackoverflow.com/a/43676353/2008111
caramba

Câu trả lời:


350

Nếu điều này sắp xảy ra .css.jsthay đổi, một cách là "xóa bộ nhớ cache" bằng cách thêm một cái gì đó như " _versionNo" vào tên tệp cho mỗi bản phát hành. Ví dụ:

script_1.0.css // This is the URL for release 1.0
script_1.1.css // This is the URL for release 1.1
script_1.2.css // etc.

Hoặc thay thế làm điều đó sau tên tập tin:

script.css?v=1.0 // This is the URL for release 1.0
script.css?v=1.1 // This is the URL for release 1.1
script.css?v=1.2 // etc.

Bạn có thể kiểm tra liên kết này để xem nó có thể hoạt động như thế nào.


10
Đây là một giải pháp khá tốt và thậm chí có thể được tự động hóa bởi hệ thống xây dựng của bạn (và nên như vậy). Stackoverflow, ví dụ, sử dụng phương pháp này.
derobert

7
SO đang sử dụng các đối số GET ngay bây giờ.
Saeb Amini

60
Tốt hơn nữa là giữ nguyên tên tệp, nhưng nối thêm số phiên bản làm tham số chuỗi truy vấn, nghĩa là script.js?v=1.2. (Hoặc nếu bạn không theo dõi các phiên bản, chỉ cần sử dụng tệp được sửa đổi lần cuối, điều này thậm chí còn dễ thực hiện hơn). Không chắc đó là ý kiến ​​của người bình luận trước đó!
Doin

5
Làm thế nào để mọi người làm điều này với kiểm soát phiên bản? Có vẻ như một nỗi đau thực sự.
Shawn

1
@Shawn Phiên bản kiểm soát khôn ngoan, bạn có thể hiển thị các <link />thẻ một cách linh hoạt và đưa phiên bản của ứng dụng làm tham số chuỗi truy vấn. Ngoài ra, một số CMS sẽ có "phiên bản tài nguyên máy khách" dưới dạng cài đặt toàn CMS được thêm vào - quản trị viên của trang có thể tự tăng phiên bản đó và các bản cập nhật của CMS cũng có thể tự động cập nhật. Dòng dưới cùng: bạn cần hiển thị URL tệp động.
Jeroen

103

Nhìn vào kiểm soát bộ đệm và Thẻ META hết hạn .

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="EXPIRES" CONTENT="Mon, 22 Jul 2002 11:12:01 GMT">

Một thực tiễn phổ biến khác là nối các chuỗi thay đổi liên tục vào cuối các tệp được yêu cầu. Ví dụ:

<script type="text/javascript" src="main.js?v=12392823"></script>


44
Điều này sẽ không giúp ích nhiều trong trường hợp nó đã được lưu trong bộ nhớ cache kể từ khi được lưu trong bộ nhớ cache, máy chủ sẽ không được truy vấn và do đó không thể phản hồi khi không có bộ đệm. Ngoài ra, thẻ meta đó thực sự không nên được sử dụng, như ghi chú nói, nó sẽ bị hỏng với bộ đệm web.
derobert

1
+1 những gì derobert nói. Luôn luôn tốt hơn để sử dụng các tiêu đề HTTP để đề xuất chính sách bộ đệm cho máy khách và bộ đệm web nhưng ngay cả điều đó không hoạt động để buộc tải lại bộ đệm.

4
+1 cho giải pháp thứ hai của bạn. Tôi có vấn đề này là bộ nhớ cache chỉ nên được xóa lần đầu tiên sau khi một số quản trị viên đã thực hiện cập nhật. Cách tiếp cận này sẽ giải quyết điều đó
Jules Colle

Vô hiệu hóa hoàn toàn bộ nhớ cache thường là một ý tưởng thực sự tồi tệ.
Jordan

73

Cập nhật 2012

Đây là một câu hỏi cũ nhưng tôi nghĩ rằng nó cần một câu trả lời cập nhật hơn bởi vì bây giờ có một cách để có nhiều quyền kiểm soát bộ nhớ đệm trang web hơn.

Trong Ứng dụng web ngoại tuyến (thực sự là bất kỳ trang web HTML5 nào) applicationCache.swapCache()có thể được sử dụng để cập nhật phiên bản được lưu trong bộ nhớ cache của trang web của bạn mà không cần phải tải lại trang theo cách thủ công.

Đây là một ví dụ mã từ Hướng dẫn cho người mới bắt đầu sử dụng Bộ đệm ứng dụng trên HTML5 Rocks giải thích cách cập nhật người dùng lên phiên bản mới nhất của trang web của bạn:

// Check if a new cache is available on page load.
window.addEventListener('load', function(e) {

  window.applicationCache.addEventListener('updateready', function(e) {
    if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
      // Browser downloaded a new app cache.
      // Swap it in and reload the page to get the new hotness.
      window.applicationCache.swapCache();
      if (confirm('A new version of this site is available. Load it?')) {
        window.location.reload();
      }
    } else {
      // Manifest didn't changed. Nothing new to server.
    }
  }, false);

}, false);

Xem thêm Sử dụng bộ đệm ứng dụng trên Mozilla Developer Network để biết thêm thông tin.

Cập nhật 2016

Mọi thứ thay đổi nhanh chóng trên Web. Câu hỏi này đã được hỏi vào năm 2009 và năm 2012 tôi đã đăng một bản cập nhật về một cách mới để xử lý vấn đề được mô tả trong câu hỏi. 4 năm nữa trôi qua và bây giờ có vẻ như nó đã bị phản đối. Cảm ơn cgaldiolo đã chỉ ra nó trong các ý kiến.

Hiện tại, kể từ tháng 7 năm 2016, Tiêu chuẩn HTML, Phần 7.9, các ứng dụng Web ngoại tuyến bao gồm cảnh báo không dùng nữa:

Tính năng này đang trong quá trình xóa khỏi nền tảng Web. (Đây là một quá trình dài phải mất nhiều năm.) Sử dụng bất kỳ tính năng ứng dụng Web ngoại tuyến nào tại thời điểm này rất không được khuyến khích. Sử dụng nhân viên dịch vụ thay thế.

Vì vậy, không dùng bộ nhớ cache ứng dụng trên Mozilla Developer Network mà tôi được tham chiếu trong năm 2012:

Không dùng nữa
Tính năng này đã bị xóa khỏi các tiêu chuẩn Web. Mặc dù một số trình duyệt vẫn có thể hỗ trợ nó, nhưng nó đang trong quá trình bị loại bỏ. Không sử dụng nó trong các dự án cũ hoặc mới. Các trang hoặc ứng dụng web sử dụng nó có thể bị hỏng bất cứ lúc nào.

Xem thêm Bug 1204581 - Thêm thông báo phản đối cho AppCache nếu chức năng chặn tìm nạp của nhân viên dịch vụ được bật .


1
Điều này có nghĩa là bạn cần sử dụng và duy trì một tệp kê khai bộ đệm?
Sam

Cảnh báo: giao diện Cache ứng dụng (AppCache) không được dùng nữa
cgaldiolo 11/07/2016

59
Vậy, khuyến nghị hiện tại của năm 2017 là gì?
Garrett

vấn đề chính mà tôi đã thấy trong chủ đề này là khi thiết bị mà người xem đang sử dụng tiếp tục sử dụng các phiên bản được lưu trong bộ nhớ cache vì bộ nhớ trong của thiết bị người dùng đã đầy. nó dường như bị kẹt trên một phiên bản được lưu trong bộ nhớ cache của trang và sẽ không cập nhật bất kỳ yếu tố nào trên tài liệu. Điều này chỉ xảy ra trong chrome ?? đó là trình duyệt duy nhất iver có kinh nghiệm về nó.
user2585548

4
2017: Sử dụng Công nhân Dịch vụ.
Digitai

27

Không phải như vậy. Một phương pháp là gửi các tiêu đề thích hợp khi phân phối nội dung để buộc trình duyệt tải lại:

Đảm bảo rằng một trang web không được lưu trong bộ nhớ cache, trên tất cả các trình duyệt.

Nếu bạn tìm kiếm "cache header"hoặc một cái gì đó tương tự ở đây trên SO, bạn sẽ tìm thấy các ví dụ cụ thể về ASP.NET.

Một cách khác, ít sạch hơn nhưng đôi khi chỉ là cách nếu bạn không thể kiểm soát các tiêu đề ở phía máy chủ, là thêm một tham số GET ngẫu nhiên vào tài nguyên đang được gọi:

myimage.gif?random=1923849839

2
Thật sự tốt hơn để phiên bản đúng các tập tin. Đây là một sự lãng phí khá lớn về băng thông, và, có lẽ quan trọng hơn, làm chậm trang web của bạn rất nhiều.
derobert

8
Điều đó thực sự phụ thuộc vào tình hình, phải không? Nếu bạn đang lập trình một CMS và cần đảm bảo tất cả các tài nguyên đã thay đổi được cập nhật chính xác, đôi khi không có cách nào xung quanh một trong hai tùy chọn này.
Pekka

Các giải pháp như thế này nên được bỏ phiếu vào tiêu cực. Tùy thuộc vào chúng tôi để giữ cho lượng khí thải CO2 của internet càng thấp càng tốt.
thời gian

14

Đối với tài nguyên tĩnh, bộ nhớ đệm phải sẽ sử dụng các tham số truy vấn có giá trị của từng phiên bản tệp hoặc triển khai. Điều này sẽ có tác dụng xóa bộ nhớ cache sau mỗi lần triển khai.

/Content/css/Site.css?version={FileVersionNumber}

Dưới đây là ví dụ ASP.NET MVC.

<link href="@Url.Content("~/Content/Css/Reset.css")?version=@this.GetType().Assembly.GetName().Version" rel="stylesheet" type="text/css" />

Đừng quên cập nhật phiên bản lắp ráp.


Cảm ơn câu trả lời này nhưng làm thế nào để làm điều đó khi chúng tôi thêm tài nguyên vào BundleTable?
toregua

Trong trường hợp của tôi, điều này đã trả về "0.0.0.0" như phiên bản. Để có phiên bản dll của ứng dụng MVC của bạn, thay vào đó, hãy sử dụng phiên bản này:?version=@ViewContext.Controller.GetType().Assembly.GetName().Version
CGodo

1
Tôi thấy rằng điều này ngăn Firefox và Chrome lưu trữ nội dung hoàn toàn.
Sam

10

Tôi đã có vấn đề tương tự và đây là cách tôi giải quyết nó:

  1. Trong index.htmltệp tôi đã thêm tệp kê khai:

    <html manifest="cache.manifest">
  2. Trong <head>phần bao gồm tập lệnh cập nhật bộ đệm:

    <script type="text/javascript" src="update_cache.js"></script>
  3. Trong <body>phần tôi đã chèn chức năng onload:

    <body onload="checkForUpdate()">
  4. Trong cache.manifesttôi đã đặt tất cả các tập tin tôi muốn lưu trữ. Điều quan trọng bây giờ là nó hoạt động trong trường hợp của tôi (Apache) chỉ bằng cách cập nhật mỗi lần nhận xét "phiên bản". Nó cũng là một tùy chọn để đặt tên tệp với "? Ver = 001" hoặc một cái gì đó ở cuối tên nhưng không cần thiết . Thay đổi chỉ # version 1.01kích hoạt sự kiện cập nhật bộ đệm.

    CACHE MANIFEST
    # version 1.01
    style.css
    imgs/logo.png
    #all other files

    Điều quan trọng là bao gồm 1., 2. và 3. chỉ trong index.html. Nếu không thì

    GET http://foo.bar/resource.ext net::ERR_FAILED

    xảy ra bởi vì mọi tệp "con" cố lưu trữ trang trong khi trang đã được lưu vào bộ đệm.

  5. Trong update_cache.jstập tin tôi đã đặt mã này:

    function checkForUpdate()
    {
        if (window.applicationCache != undefined && window.applicationCache != null)
        {
            window.applicationCache.addEventListener('updateready', updateApplication);
        }
    }
    function updateApplication(event)
    {
        if (window.applicationCache.status != 4) return;
        window.applicationCache.removeEventListener('updateready', updateApplication);
        window.applicationCache.swapCache();
        window.location.reload();
    }

Bây giờ bạn chỉ cần thay đổi tập tin và trong bản kê khai bạn phải cập nhật nhận xét phiên bản. Bây giờ truy cập trang index.html sẽ cập nhật bộ đệm.

Các phần của giải pháp không phải của tôi nhưng tôi đã tìm thấy chúng qua internet và kết hợp lại để nó hoạt động.


Tôi có thể biết CACHE.MANIFEST được viết ở đâu không.
Shweta Gulati

1
Shweta Gulati Tệp kê khai phải nằm trong cùng thư mục với tệp "chỉ mục". Thời gian nó không hoạt động là gì?
Wojtek Mazurek

1
@ShwetaGulati Có, bộ đệm không phát hiện các thay đổi trong tệp html - đó là lý do tại sao Bạn phải cập nhật số phiên bản trong tệp kê khai, vì đó là bản đang được kiểm tra thay đổi. Thật sự rất khó để giúp bạn, vì tôi không biết chi tiết. Xin vui lòng, cho tôi biết nếu bạn đã đặt tất cả các tệp mong muốn được lưu vào bộ đệm trong tệp kê khai? Đường dẫn phải liên quan đến tệp kê khai. Bạn có thể cho tôi địa chỉ trang web của bạn và tôi có thể biết vấn đề là gì :)
Wojtek Mazurek

1
@ShwetaGulati Đó là vì trình duyệt lưu trữ một số tệp tự động để giúp tải trang nhanh hơn. Đó là hành vi mặc định và chỉ phụ thuộc vào trình duyệt nên bạn không thể thiết lập nó theo bất kỳ cách nào. Đặc biệt là các tệp js nằm trong phạm vi của trình duyệt, vì chúng thường được sử dụng trên tất cả các trang trên trang web nên việc lưu trữ chúng vào bộ đệm là điều khôn ngoan. Không có cách nào khác ngoài việc ghi tất cả tên của tệp vào tệp kê khai để lưu trữ tất cả các tệp. Nếu bạn tìm thấy bất kỳ, hãy cho tôi biết, bởi vì tôi cũng cần nó :)
Wojtek Mazurek

1
Đường dẫn tuyệt đối đến các tệp của bạn không thành vấn đề. Đường dẫn tương đối từ các vấn đề địa chỉ vì trình duyệt gửi yêu cầu cho các tệp. F.ex: Tôi có domain example.com và nó trên serwer name.com. Không gian của tôi trên đó là example.names.com. Vì vậy, tôi tham gia tên miền example.com vào không gian máy chủ của tôi example.names.com làm chuyển hướng. Để làm điều đó tôi cần đặt thư mục làm mục tiêu của chuyển hướng này. Vì vậy, nếu tôi muốn có một vài trang web trên example.names.com Tôi tạo thư mục "name1", đặt chuyển hướng đến nó và đặt tất cả các tệp của tôi vào trong. Đường dẫn được tính từ đây. Nếu tôi có name1 \ scripts \ test.js trong tệp kê khai, tôi viết scripts \ test.js.
Wojtek Mazurek

7

Tôi đã có một trường hợp tôi sẽ chụp ảnh khách hàng trực tuyến và sẽ cần cập nhật div nếu một bức ảnh bị thay đổi. Trình duyệt vẫn hiển thị ảnh cũ. Vì vậy, tôi đã sử dụng hack để gọi một biến GET ngẫu nhiên, sẽ là duy nhất mỗi lần. Đây là nếu nó có thể giúp bất cứ ai

<img src="/photos/userid_73.jpg?random=<?php echo rand() ?>" ...

EDIT Như được chỉ ra bởi những người khác, sau đây là giải pháp hiệu quả hơn nhiều vì nó sẽ chỉ tải lại hình ảnh khi chúng được thay đổi, xác định thay đổi này theo kích thước tệp:

<img src="/photos/userid_73.jpg?modified=<? filemtime("/photos/userid_73.jpg")?>"

29
Điều này không thanh lịch chút nào, nó sẽ làm cho trang web tải lại hình ảnh mỗi lần lãng phí rất nhiều thời gian tải xuống tài nguyên, một giải pháp tốt hơn là sử dụng kích thước tệp thay vì một số ngẫu nhiên, điều này sẽ khiến bộ đệm chỉ xác nhận lại khi tệp thực sự thay đổi
Roberto Arosemena

8
Hoặc một hàm băm của byte hình ảnh
Taylor Edmiston

1
Tất cả phụ thuộc vào yêu cầu của người dùng. Đối với số lượng lớn kịch bản ảnh sẽ khác với một vài ảnh. Kiểm tra kích thước tệp sẽ tiết kiệm băng thông, nhưng cũng sẽ thêm xử lý, có khả năng làm chậm tải trang. Trong trường hợp của tôi, nơi hình ảnh thay đổi khá thường xuyên và quyết định kinh doanh quan trọng là người dùng sẽ có được những bức ảnh cập nhật nhất, đây là một giải pháp hoàn hảo.
zeeshan

Bạn có thể làm cho nó trở thành một giá trị tĩnh trong cấu hình, đây không phải là một cách tiếp cận lý tưởng.
Seer

3
<img src = "/ photos / userid_73.jpg? đã sửa đổi = <? = filemtime (" / photos / userid_73.jpg ")?>" sẽ hữu ích hơn nhiều!
Phần mềm Fusca

4

Rất nhiều câu trả lời bị thiếu điểm - hầu hết các nhà phát triển đều nhận thức rõ rằng tắt bộ đệm là không hiệu quả. Tuy nhiên, có nhiều trường hợp phổ biến trong đó hiệu quả là không quan trọng và hành vi bộ đệm mặc định bị phá vỡ nghiêm trọng.

Chúng bao gồm lồng ghép, kiểm tra kịch bản lặp (cái lớn!) Và cách giải quyết phần mềm của bên thứ ba. Không có giải pháp nào được đưa ra ở đây là đủ để giải quyết các tình huống phổ biến như vậy. Hầu hết các trình duyệt web là bộ nhớ đệm quá tích cực và không cung cấp phương tiện hợp lý để tránh những vấn đề này.



2

Cập nhật URL cho các công việc sau đây cho tôi:

/custom.js?id=1

Bằng cách thêm một số duy nhất sau ?id=và tăng nó cho những thay đổi mới, người dùng không phải nhấn CTRL + F5để làm mới bộ đệm. Ngoài ra, bạn có thể nối thêm phiên bản băm hoặc chuỗi của thời gian hiện tại hoặc Epoch sau?id=

Cái gì đó như ?id=1520606295


1

Đây là trang MDSN về thiết lập bộ nhớ đệm trong ASP.NET.

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60))
Response.Cache.SetCacheability(HttpCacheability.Public)
Response.Cache.SetValidUntilExpires(False)
Response.Cache.VaryByParams("Category") = True

If Response.Cache.VaryByParams("Category") Then
   '...
End If

1

Không chắc chắn nếu điều đó thực sự có thể giúp bạn nhưng đó là cách bộ nhớ đệm nên hoạt động trên bất kỳ trình duyệt nào. Khi trình duyệt yêu cầu một tệp, nó sẽ luôn gửi yêu cầu đến máy chủ trừ khi có chế độ "ngoại tuyến". Máy chủ sẽ đọc một số tham số như ngày sửa đổi hoặc etags.

Máy chủ sẽ trả về phản hồi lỗi 304 cho KHÔNG ĐƯỢC SỬA ĐỔI và trình duyệt sẽ phải sử dụng bộ đệm của nó. Nếu etag không xác thực ở phía máy chủ hoặc ngày sửa đổi thấp hơn ngày sửa đổi hiện tại, máy chủ sẽ trả về nội dung mới với ngày sửa đổi mới hoặc etags hoặc cả hai.

Nếu không có dữ liệu bộ nhớ đệm được gửi đến trình duyệt, tôi đoán hành vi này không được xác định, trình duyệt có thể hoặc không thể lưu tệp bộ nhớ cache không cho biết cách chúng được lưu trong bộ nhớ cache. Nếu bạn đặt tham số bộ đệm trong phản hồi, nó sẽ lưu các tệp của bạn một cách chính xác và sau đó máy chủ có thể chọn trả về lỗi 304 hoặc nội dung mới.

Đây là cách nó nên được thực hiện. Sử dụng thông số ngẫu nhiên hoặc số phiên bản trong url giống như một bản hack hơn bất cứ thứ gì.

http://www.checkupdown.com/status/E304.html http://en.wikipedia.org/wiki/HTTP_ETag http://www.xpertdeveloper.com/2011/03/last-modified-header-vs- hết hạn-tiêu đề-vs-etag /

Sau khi đọc tôi thấy rằng cũng có một ngày hết hạn. Nếu bạn gặp vấn đề, có thể bạn đã hết hạn sử dụng. Nói cách khác, khi trình duyệt sẽ lưu trữ tệp của bạn, vì nó đã hết hạn sử dụng, nên không cần phải yêu cầu lại trước ngày đó. Nói cách khác, nó sẽ không bao giờ yêu cầu tệp đến máy chủ và sẽ không bao giờ nhận được 304 không được sửa đổi. Nó chỉ đơn giản là sử dụng bộ đệm cho đến khi hết hạn sử dụng hoặc xóa bộ đệm.

Vì vậy, đó là dự đoán của tôi, bạn có một số ngày hết hạn và bạn nên sử dụng etags sửa đổi lần cuối hoặc kết hợp tất cả và đảm bảo rằng không có ngày hết hạn.

Nếu mọi người có xu hướng làm mới rất nhiều và tập tin không bị thay đổi nhiều, thì có lẽ nên đặt ngày hết hạn lớn.

2 xu của tôi!


1

Tôi đã triển khai giải pháp đơn giản này phù hợp với tôi (chưa có trên môi trường sản xuất):

function verificarNovaVersio() {
    var sVersio = localStorage['gcf_versio'+ location.pathname] || 'v00.0.0000';
    $.ajax({
        url: "./versio.txt"
        , dataType: 'text'
        , cache: false
        , contentType: false
        , processData: false
        , type: 'post'
     }).done(function(sVersioFitxer) {
        console.log('Versió App: '+ sVersioFitxer +', Versió Caché: '+ sVersio);
        if (sVersio < (sVersioFitxer || 'v00.0.0000')) {
            localStorage['gcf_versio'+ location.pathname] = sVersioFitxer;
            location.reload(true);
        }
    });
}

Tôi có một tập tin nhỏ nằm ở nơi chứa html:

"Versio.txt":

v00.5.0014

Hàm này được gọi trong tất cả các trang của tôi, vì vậy khi tải nó sẽ kiểm tra xem giá trị phiên bản của localStorage có thấp hơn phiên bản hiện tại hay không

location.reload(true);

... Để buộc tải lại từ máy chủ thay vì từ bộ đệm.

(rõ ràng, thay vì localStorage, bạn có thể sử dụng cookie hoặc bộ nhớ máy khách liên tục khác)

Tôi đã chọn giải pháp này vì tính đơn giản của nó, bởi vì chỉ duy trì một tệp duy nhất "Versio.txt" sẽ buộc toàn bộ trang web phải tải lại.

Phương thức queryString khó thực hiện và cũng được lưu vào bộ đệm (nếu bạn thay đổi từ v1.1 sang phiên bản trước sẽ tải từ bộ đệm, thì điều đó có nghĩa là bộ đệm không bị xóa, giữ tất cả các phiên bản trước đó trong bộ đệm).

Tôi là một người mới và tôi sẽ kiểm tra và kiểm tra chuyên môn của bạn để đảm bảo phương pháp của tôi là một phương pháp tốt.

Hy vọng nó giúp.



0

Có một mẹo có thể được sử dụng. Thủ thuật là nối 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ù cái gì xuất hiện sau dấu "?" là các tham số. Vì vậy, wat 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 người dùng sẽ thấy tệp đã thay đổi và lấy một bản sao mới.


0

Buộc các trình duyệt xóa bộ nhớ cache hoặc tải lại dữ liệu chính xác? Tôi đã thử hầu hết các giải pháp được mô tả trong stackoverflow, một số công việc, nhưng sau một thời gian, nó sẽ lưu cache và hiển thị tập lệnh hoặc tập tin được tải trước đó. Có cách nào khác để xóa bộ nhớ cache (css, js, v.v.) và thực sự hoạt động trên tất cả các trình duyệt không?

Tôi đã tìm thấy cho đến nay các tài nguyên cụ thể có thể được tải lại riêng lẻ nếu bạn thay đổi ngày và giờ trên các tệp của mình trên máy chủ. "Xóa bộ nhớ cache" không dễ như mong muốn. Thay vì xóa bộ nhớ cache trên trình duyệt của tôi, tôi nhận ra rằng việc "chạm" vào các tệp máy chủ được lưu trong bộ nhớ cache sẽ thực sự thay đổi ngày và giờ của tệp nguồn được lưu trong máy chủ (Đã kiểm tra trên Edge, Chrome và Firefox) và hầu hết các trình duyệt sẽ tự động tải xuống nhiều nhất bản sao mới hiện tại của whats trên máy chủ của bạn (mã, đồ họa cũng đa phương tiện). Tôi khuyên bạn chỉ nên sao chép các tập lệnh mới nhất trên máy chủ và giải pháp "thực hiện cảm ứng" trước khi chương trình của bạn chạy, vì vậy nó sẽ thay đổi ngày của tất cả các tệp vấn đề của bạn thành ngày và giờ mới nhất, sau đó nó tải xuống một bản sao mới vào trình duyệt của bạn:

<?php
   touch('/www/sample/file1.css');
   touch('/www/sample/file2.js');
?>

sau đó ... phần còn lại của chương trình của bạn ...

Tôi phải mất một thời gian để giải quyết vấn đề này (vì nhiều trình duyệt hoạt động khác nhau với các lệnh khác nhau, nhưng tất cả đều kiểm tra thời gian của tệp và so sánh với bản sao đã tải xuống trong trình duyệt của bạn, nếu ngày và giờ khác, sẽ thực hiện làm mới), Nếu bạn Không thể đi đúng hướng, luôn có một giải pháp hữu ích và tốt hơn cho nó. Trân trọng và cắm trại vui vẻ. Bằng cách chạm (); hoặc các lựa chọn thay thế hoạt động trong nhiều ngôn ngữ lập trình được bao gồm trong javascript bash sh php và bạn có thể bao gồm hoặc gọi chúng trong html.


1
nếu tệp được sửa đổi, dấu thời gian đã được thay đổi, vì vậy không có lợi ích gì khi buộc nó lại.
Phần mềm Fusca

Lệnh cảm ứng hoàn toàn không thay đổi tập tin. Nó thay đổi thuộc tính của ngày và thời gian, chuyển đổi nó thành phiên bản mới hơn đánh lừa trình duyệt để tải xuống dưới dạng bản sao mới.
Luis H Cabrejo

-1

Bạn có muốn xóa bộ nhớ cache hoặc chỉ đảm bảo trang hiện tại (đã thay đổi?) Không được lưu trong bộ nhớ cache?

Nếu sau này, nó sẽ đơn giản như

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

Tôi đã đọc về cách tiếp cận này gần đây trong một bài đăng trên Chrome và tôi chỉ tìm thấy kết quả nhất quán trên một số ít máy chủ trực tiếp, tệp tin localhost và Windows ... với Firefox 3.6.
danjah
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.