क्या कोई ऐसा तरीका है जो मैं अपने पेज पर कुछ कोड डाल सकता हूं, जब कोई साइट पर जाता है, तो यह ब्राउज़र कैश को साफ करता है, इसलिए वे बदलाव देख सकते हैं?
उपयोग की जाने वाली भाषाएँ: ASP.NET, VB.NET और बेशक HTML, CSS और jQuery।
क्या कोई ऐसा तरीका है जो मैं अपने पेज पर कुछ कोड डाल सकता हूं, जब कोई साइट पर जाता है, तो यह ब्राउज़र कैश को साफ करता है, इसलिए वे बदलाव देख सकते हैं?
उपयोग की जाने वाली भाषाएँ: ASP.NET, VB.NET और बेशक HTML, CSS और jQuery।
जवाबों:
यदि इसके बारे में है .css
और .js
बदलता है, तो एक तरीका "कैश बस्टिंग" है, जो _versionNo
प्रत्येक रिलीज़ के लिए फ़ाइल नाम के साथ कुछ " " जोड़कर है । उदाहरण के लिए:
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.
या वैकल्पिक रूप से फ़ाइल नाम के बाद करें:
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.
आप इस लिंक को देख सकते हैं कि यह कैसे काम कर सकता है।
script.js?v=1.2
। (या यदि आप संस्करणों का ट्रैक नहीं रख रहे हैं, तो बस अंतिम-संशोधित समय का उपयोग करें, जो करना और भी आसान है)। यकीन नहीं होता कि क्या पिछले टिप्पणीकार का मतलब है!
<link />
टैग को गतिशील रूप से प्रस्तुत कर सकते हैं और अनुप्रयोग के संस्करण को क्वेरी स्ट्रिंग पैरामीटर के रूप में इंजेक्ट कर सकते हैं। वैकल्पिक रूप से, कुछ सीएमएस में एक "क्लाइंट रिसोर्स वर्जन" होगा, जिसे सीएमएस-वाइड सेटिंग के साथ जोड़ा जाता है - साइट का एडमिन मैन्युअल रूप से उस वर्जन एनआर को बढ़ा सकता है, और सीएमएस के अपडेट भी इसे ऑटोमैटिकली अपडेट कर सकते हैं। नीचे पंक्ति: आपको गतिशील रूप से फ़ाइल URLs को प्रस्तुत करना होगा।
में देखो कैश-नियंत्रण और समाप्त हो रहा है मेटा टैग।
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="EXPIRES" CONTENT="Mon, 22 Jul 2002 11:12:01 GMT">
एक और सामान्य प्रथा है अनुरोधित फ़ाइलों के अंत में लगातार बदलते तार जोड़ना। उदाहरण के लिए:
<script type="text/javascript" src="main.js?v=12392823"></script>
यह एक पुराना प्रश्न है, लेकिन मुझे लगता है कि इसका उत्तर देने के लिए और अधिक आवश्यकता है क्योंकि अब वेबसाइट कैशिंग के अधिक नियंत्रण का एक तरीका है।
में ऑफलाइन वेब अनुप्रयोग (जो वास्तव में किसी भी एचटीएमएल 5 वेबसाइट है) applicationCache.swapCache()
मैन्युअल पृष्ठ पुनः लोड करने की आवश्यकता के बिना अपनी वेबसाइट का संचित संस्करण अद्यतन करने के लिए इस्तेमाल किया जा सकता।
यह एचटीएमएल 5 रॉक्स पर एप्लिकेशन कैश का उपयोग करने के लिए शुरुआती गाइड से एक कोड उदाहरण है, जिसमें बताया गया है कि उपयोगकर्ताओं को आपकी साइट के नवीनतम संस्करण में कैसे अपडेट किया जाए:
// 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);
अधिक जानकारी के लिए मोज़िला डेवलपर नेटवर्क पर एप्लिकेशन कैश का उपयोग करना भी देखें ।
वेब पर चीजें जल्दी बदल जाती हैं। यह प्रश्न 2009 में पूछा गया था और 2012 में मैंने प्रश्न में वर्णित समस्या को संभालने के लिए एक नए तरीके के बारे में अपडेट पोस्ट किया था। एक और 4 साल बीत गए और अब ऐसा लगता है कि यह पहले से ही पदावनत है। टिप्पणी में इसे इंगित करने के लिए cgaldiolo का धन्यवाद ।
वर्तमान में, जुलाई 2016 तक, HTML मानक, धारा 7.9, ऑफ़लाइन वेब अनुप्रयोगों में एक अपग्रेड चेतावनी शामिल है:
यह सुविधा वेब प्लेटफ़ॉर्म से निकाले जाने की प्रक्रिया में है। (यह एक लंबी प्रक्रिया है जिसमें कई साल लगते हैं।) इस समय किसी भी ऑफ़लाइन वेब एप्लिकेशन सुविधाओं का उपयोग करना बहुत हतोत्साहित करता है। इसके बजाय सेवा कार्यकर्ताओं का उपयोग करें।
तो मोज़िला डेवलपर नेटवर्क पर एप्लिकेशन कैश का उपयोग करता है जिसे मैंने 2012 में संदर्भित किया था:
पदावनत
इस सुविधा को वेब मानकों से हटा दिया गया है। हालांकि कुछ ब्राउज़र अभी भी इसका समर्थन कर सकते हैं, यह गिराए जाने की प्रक्रिया में है। पुराने या नए प्रोजेक्ट्स में इसका इस्तेमाल न करें। इसका उपयोग करने वाले पृष्ठ या वेब एप्लिकेशन किसी भी समय टूट सकते हैं।
बग 1204581 भी देखें - यदि सर्विस वर्कर का इंटरसेप्शन सक्षम है तो AppCache के लिए एक डिप्रेसेशन नोटिस जोड़ें ।
ऐसे नहीं। ब्राउज़र को पुनः लोड करने के लिए सामग्री वितरित करते समय उपयुक्त हेडर भेजने के लिए एक विधि है:
यह सुनिश्चित करना कि सभी ब्राउज़रों में एक वेब पेज कैश नहीं है।
यदि आपकी खोज "cache header"
एसओ पर यहां या कुछ इसी तरह की है, तो आपको ASP.NET विशिष्ट उदाहरण मिलेंगे।
एक और, कम साफ लेकिन कभी-कभी एक ही रास्ता अगर आप सर्वर की तरफ हेडर को नियंत्रित नहीं कर सकते हैं, तो उस संसाधन के लिए एक यादृच्छिक GET पैरामीटर जोड़ रहा है जिसे कहा जा रहा है:
myimage.gif?random=1923849839
के लिए निश्चित संसाधनों सही कैशिंग करने के लिए किया जाएगा क्वेरी पैरामीटर का उपयोग प्रत्येक तैनाती या फ़ाइल संस्करण के मूल्य के साथ। यह प्रत्येक परिनियोजन के बाद कैश साफ़ करने का प्रभाव होगा।
/Content/css/Site.css?version={FileVersionNumber}
यहाँ ASP.NET MVC उदाहरण है।
<link href="@Url.Content("~/Content/Css/Reset.css")?version=@this.GetType().Assembly.GetName().Version" rel="stylesheet" type="text/css" />
विधानसभा संस्करण को अद्यतन करने के लिए मत भूलना।
?version=@ViewContext.Controller.GetType().Assembly.GetName().Version
मुझे समस्या का सामना करना पड़ा और मैंने इसे हल किया:
में index.html
फ़ाइल मैं प्रकट जोड़ दिया है:
<html manifest="cache.manifest">
में <head>
अनुभाग स्क्रिप्ट कैश को अद्यतन करने में शामिल हैं:
<script type="text/javascript" src="update_cache.js"></script>
में <body>
खंड मैं समारोह ऑनलोड डाला है:
<body onload="checkForUpdate()">
में cache.manifest
मैं सभी फाइलों को डाल दिया है मैं कैश करना चाहते हैं। अब यह महत्वपूर्ण है कि यह हर बार "संस्करण" टिप्पणी को अपडेट करके मेरे मामले (अपाचे) में काम करता है। यह नाम के अंत में "? Ver = 001" या कुछ के साथ फ़ाइलों को नाम देने का एक विकल्प भी है, लेकिन इसकी आवश्यकता नहीं है । सिर्फ # version 1.01
कैश अपडेट ईवेंट को ट्रिगर करना।
CACHE MANIFEST
# version 1.01
style.css
imgs/logo.png
#all other files
केवल index.html में 1., 2. और 3. को शामिल करना महत्वपूर्ण है । अन्यथा
GET http://foo.bar/resource.ext net::ERR_FAILED
तब होता है क्योंकि प्रत्येक "बच्चा" फ़ाइल पृष्ठ को कैश करने का प्रयास करती है जबकि पृष्ठ पहले से ही कैश हो चुका होता है।
में update_cache.js
फ़ाइल मैं इस कोड डाल दिया है:
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();
}
अब आप बस फाइलें बदलते हैं और प्रकट में आपको संस्करण टिप्पणी को अद्यतन करना होगा। अब index.html पेज पर जाकर कैशे को अपडेट करना होगा।
समाधान के हिस्से मेरे नहीं हैं, लेकिन मैंने उन्हें इंटरनेट के माध्यम से पाया है और एक साथ रखा है ताकि यह काम करे।
मेरे पास एक मामला था जहां मैं ग्राहकों की तस्वीरें ऑनलाइन ले जाऊंगा और अगर एक तस्वीर बदल दी जाए तो उसे अपडेट करना होगा। ब्राउज़र अभी भी पुरानी तस्वीर दिखा रहा था। इसलिए मैंने एक यादृच्छिक जीईटी चर को कॉल करने की हैक का उपयोग किया, जो हर बार अद्वितीय होगा। यहाँ यह है अगर यह किसी को भी मदद कर सकता है
<img src="/photos/userid_73.jpg?random=<?php echo rand() ?>" ...
संपादित करें जैसा कि दूसरों ने बताया है, निम्नलिखित बहुत अधिक कुशल समाधान है क्योंकि यह केवल छवियों को फिर से लोड करेगा जब वे बदल जाते हैं, फ़ाइल आकार द्वारा इस परिवर्तन की पहचान करना:
<img src="/photos/userid_73.jpg?modified=<? filemtime("/photos/userid_73.jpg")?>"
बहुत सारे उत्तर इस बिंदु को याद कर रहे हैं - अधिकांश डेवलपर्स अच्छी तरह से जानते हैं कि कैश को बंद करना अक्षम है। हालांकि, कई सामान्य परिस्थितियां हैं जहां दक्षता महत्वहीन है और डिफ़ॉल्ट कैश व्यवहार बुरी तरह से टूट गया है।
इनमें नेस्टेड, इटेरेटिव स्क्रिप्ट टेस्टिंग (बड़ा वाला!) और टूटी हुई थर्ड पार्टी सॉफ्टवेयर वर्कअराउंड शामिल हैं। यहां दिए गए समाधानों में से कोई भी ऐसे सामान्य परिदृश्यों को संबोधित करने के लिए पर्याप्त नहीं है। अधिकांश वेब ब्राउज़र बहुत अधिक आक्रामक कैशिंग हैं और इन समस्याओं से बचने के लिए कोई समझदार साधन प्रदान नहीं करते हैं।
<meta http-equiv="pragma" content="no-cache" />
यह भी देखें /programming/126772/how-to-force-a-web-browser-not-to-cache-images
मेरे लिए निम्न कार्यों के लिए URL अपडेट करना:
/custom.js?id=1
बाद में एक अद्वितीय संख्या जोड़कर ?id=
और नए परिवर्तनों के लिए इसे बढ़ाकर, उपयोगकर्ताओं को प्रेस करने की आवश्यकता नहीं हैCTRL + F5
को कैश ताज़ा करने के करने की । वैकल्पिक रूप से, आप वर्तमान समय या उसके बाद के युग के हैश या स्ट्रिंग संस्करण को जोड़ सकते हैं?id=
कुछ इस तरह ?id=1520606295
यहां ASP.NET में कैशिंग सेट करने पर MDSN पेज दिया गया है।
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
यकीन नहीं है कि अगर यह वास्तव में आपकी मदद कर सकता है, लेकिन यह है कि किसी भी ब्राउज़र पर कैशिंग को कैसे काम करना चाहिए। जब ब्राउज़र एक फ़ाइल का अनुरोध करता है, तो उसे हमेशा सर्वर को एक अनुरोध भेजना चाहिए जब तक कि "ऑफ़लाइन" मोड न हो। सर्वर कुछ पैरामीटर्स को पढ़ेगा जैसे डेट मॉडिफाइड या ईटैग्स।
सर्वर MODIIED के लिए 304 त्रुटि प्रतिक्रिया लौटाएगा और ब्राउज़र को अपने कैश का उपयोग करना होगा। यदि etag सर्वर साइड पर मान्य नहीं है या संशोधित दिनांक वर्तमान संशोधित तिथि से नीचे है, तो सर्वर को नई संशोधित तिथि या etags या दोनों के साथ नई सामग्री को वापस करना चाहिए।
यदि ब्राउज़र पर कोई कैशिंग डेटा नहीं भेजा गया है, तो मुझे लगता है कि व्यवहार अनिर्धारित है, ब्राउज़र फ़ाइल को कैश कर सकता है या नहीं कर सकता है जो यह नहीं बताता है कि वे कैसे कैश हैं। यदि आप प्रतिक्रिया में कैशिंग पैरामीटर सेट करते हैं तो यह आपकी फ़ाइलों को सही ढंग से कैश करेगा और सर्वर तब 304 त्रुटि, या नई सामग्री को वापस करने का विकल्प चुन सकता है।
इस तरह से यह किया जाना चाहिए। Urls में यादृच्छिक params या संस्करण संख्या का उपयोग करना किसी भी चीज़ की तुलना में हैक की तरह अधिक है।
http://www.checkupdown.com/status/E304.html http://en.wikipedia.org/wiki/HTTP_ETag http://www.xpertdeveloper.com/2011/03/last-modified-header-vs- समय सीमा समाप्त हो हेडर-बनाम-ETag /
पढ़ने के बाद मैंने देखा कि एक एक्सपायरी डेट भी है। यदि आपको समस्या है, तो हो सकता है कि आपके पास एक समाप्ति तिथि हो। दूसरे शब्दों में, जब ब्राउज़र आपकी फ़ाइल को कैश कर देगा, चूंकि इसकी समाप्ति की तारीख है, तो इसे उस तारीख से पहले इसे फिर से अनुरोध नहीं करना चाहिए। दूसरे शब्दों में, यह सर्वर से फ़ाइल को कभी नहीं पूछेगा और कभी भी संशोधित नहीं 304 प्राप्त करेगा। यह बस तब तक कैश का उपयोग करेगा जब तक कि एक्सपायरी डेट नहीं हो जाती या कैश क्लियर नहीं हो जाता।
तो यह मेरा अनुमान है, आपके पास किसी प्रकार की समाप्ति तिथि है और आपको अंतिम-संशोधित etags या इन सभी के मिश्रण का उपयोग करना चाहिए और सुनिश्चित करें कि कोई समाप्ति तिथि नहीं है।
यदि लोग बहुत अधिक ताज़ा करते हैं और फ़ाइल बहुत अधिक नहीं बदली जाती है, तो एक बड़ी समाप्ति तिथि निर्धारित करना बुद्धिमानी हो सकती है।
मेरे 2 सेंट!
मैंने इस सरल समाधान को लागू किया जो मेरे लिए काम करता है (उत्पादन वातावरण पर अभी तक नहीं):
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);
}
});
}
मैंने एक छोटी फ़ाइल स्थित की है जहाँ html हैं:
"Versio.txt":
v00.5.0014
इस फ़ंक्शन को मेरे सभी पृष्ठों में कहा जाता है, इसलिए इसे लोड करते समय यह जांचता है कि क्या लोकलस्टोरेज का वर्जन वैल्यू मौजूदा वर्जन से कम है और क्या करता है?
location.reload(true);
... कैश के बजाय सर्वर से पुनः लोड करने के लिए।
(स्पष्ट रूप से, लोकलस्टोरेज के बजाय आप कुकीज़ या अन्य लगातार ग्राहक भंडारण का उपयोग कर सकते हैं)
मैंने इस समाधान के लिए इसकी सादगी का विकल्प चुना, क्योंकि केवल एक फाइल "वर्सिओ.टेक्स्ट" को म्यूट करने से पूरी साइट पुनः लोड होने के लिए मजबूर हो जाएगी।
क्वेरीस्ट्रिंग विधि को लागू करना कठिन है और इसे कैश भी किया जाता है (यदि आप v1.1 से पिछले संस्करण में बदलते हैं तो कैश से लोड हो जाएगा, तो इसका मतलब है कि कैश फ्लश नहीं किया गया है, पिछले सभी संस्करणों को कैश में रखते हुए)।
मैं थोड़ा नौसिखिया हूँ और मैं यह सुनिश्चित करने के लिए कि आपके तरीके एक अच्छा तरीका है, अपने पेशेवर जाँच और समीक्षा के बारे में बताएं।
आशा करता हूँ की ये काम करेगा।
कैश-कंट्रोल सेट करने के अलावा: नो-कैश, आपको एक्सपायर हेडर को भी -1 पर सेट करना चाहिए, यदि आप चाहें तो स्थानीय कॉपी को हर बार रिफ्रेश किया जा सकता है (आईई के कुछ वर्जन की आवश्यकता होती है)।
HTTP कैश देखें - सर्वर से जांच करें, हमेशा If-Modified-चूंकि भेज रहा है
एक चाल है जिसका उपयोग किया जा सकता है। चाल को स्क्रिप्ट टैग में फ़ाइल नाम के पैरामीटर / स्ट्रिंग को जोड़ना है और फ़ाइल बदलने पर इसे बदलना है।
<script src="myfile.js?version=1.0.0"></script>
ब्राउज़र पूरे स्ट्रिंग को फ़ाइल पथ के रूप में व्याख्या करता है, भले ही "के बाद आता है?" पैरामीटर हैं। तो अब ऐसा होता है कि अगली बार जब आप अपनी फ़ाइल को अपडेट करते हैं, तो बस अपनी वेबसाइट (उदाहरण <script src="myfile.js?version=1.0.1"></script>
) पर स्क्रिप्ट टैग में नंबर बदलें और प्रत्येक उपयोगकर्ता ब्राउज़र देखेगा कि फ़ाइल बदल गई है और एक नई प्रतिलिपि ले सकती है।
कैश साफ़ करने या सही डेटा पुनः लोड करने के लिए फोर्स ब्राउज़र?मैंने स्टैकओवरफ्लो में वर्णित अधिकांश समाधानों की कोशिश की है, कुछ काम करते हैं, लेकिन थोड़ी देर के बाद, यह अंततः कैश करता है और पिछली भरी हुई स्क्रिप्ट या फ़ाइल को प्रदर्शित करता है। वहाँ एक और तरीका है जो कैश (सीएसएस, जेएस, आदि) को साफ करेगा और वास्तव में सभी ब्राउज़रों पर काम करेगा?
मैंने अब तक पाया कि यदि आप सर्वर पर अपनी फाइलों पर तारीख और समय को बदलते हैं तो विशिष्ट संसाधन व्यक्तिगत रूप से पुनः लोड किए जा सकते हैं। "कैश को साफ़ करना" उतना आसान नहीं है जितना इसे होना चाहिए। अपने ब्राउज़रों पर कैश को साफ़ करने के बजाय, मैंने महसूस किया कि कैश की गई सर्वर फ़ाइलों को "टच" करने से सर्वर पर कैश्ड सोर्स फ़ाइल की तारीख और समय बदल जाएगा (एज, क्रोम और फ़ायरफ़ॉक्स पर परीक्षण) और अधिकांश ब्राउज़र अपने आप सबसे डाउनलोड हो जाएंगे आपके सर्वर पर व्हाट्स की वर्तमान ताज़ा प्रतिलिपि (कोड, ग्राफिक्स किसी भी मल्टीमीडिया)। मेरा सुझाव है कि आप सर्वर पर सबसे वर्तमान स्क्रिप्ट को कॉपी करें और अपने कार्यक्रम को चलाने से पहले "टच द चीज़" समाधान करें, इसलिए यह आपकी सभी समस्या फ़ाइलों की तारीख को एक वर्तमान तिथि और समय में बदल देगा, फिर यह एक नई प्रतिलिपि डाउनलोड करता है अपने ब्राउज़र पर:
<?php
touch('/www/sample/file1.css');
touch('/www/sample/file2.js');
?>
फिर ... आपके कार्यक्रम के बाकी ...
इस समस्या को हल करने में मुझे कुछ समय लगा (क्योंकि कई ब्राउज़र अलग-अलग कमांड के लिए अलग-अलग कार्य करते हैं, लेकिन वे सभी फाइलों का समय जाँचते हैं और आपके ब्राउज़र में आपकी डाउनलोड की गई कॉपी की तुलना करते हैं, यदि अलग-अलग तारीख और समय, ताज़ा करेंगे), यदि आप माना जाता है कि सही तरीके से नहीं जा सकता, वहाँ हमेशा एक और प्रयोग करने योग्य और बेहतर समाधान है। सर्वश्रेष्ठ सादर और खुश शिविर। वैसे स्पर्श (); या विकल्प कई प्रोग्रामिंग भाषाओं में जावास्क्रिप्ट बाश श php में शामिल हैं और आप उन्हें html में शामिल या कॉल कर सकते हैं।
क्या आप कैश साफ़ करना चाहते हैं, या बस यह सुनिश्चित करें कि आपका करंट (बदला हुआ?) पेज कैश नहीं है?
यदि उत्तरार्द्ध, यह उतना ही सरल होना चाहिए जितना कि
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">