कैश को साफ़ करने के लिए फोर्स ब्राउज़र


283

क्या कोई ऐसा तरीका है जो मैं अपने पेज पर कुछ कोड डाल सकता हूं, जब कोई साइट पर जाता है, तो यह ब्राउज़र कैश को साफ करता है, इसलिए वे बदलाव देख सकते हैं?

उपयोग की जाने वाली भाषाएँ: ASP.NET, VB.NET और बेशक HTML, CSS और jQuery।


"स्पष्ट कैश" के लिए एक अच्छा समाधान या समाधान यहां पाया जा सकता है: stackoverflow.com/a/43676353/2008111
caramba

जवाबों:


350

यदि इसके बारे में है .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.

आप इस लिंक को देख सकते हैं कि यह कैसे काम कर सकता है।


10
यह एक काफी अच्छा समाधान है, और यहां तक ​​कि आपके बिल्ड सिस्टम द्वारा स्वचालित किया जा सकता है (और होना चाहिए)। Stackoverflow, उदाहरण के लिए, इस दृष्टिकोण का उपयोग करता है।
derobert

7
SO अब GET तर्कों का उपयोग कर रहा है।
साब अमीनी

60
बेहतर अभी तक फ़ाइल नाम के रूप में रखने के लिए है, लेकिन वर्जन संख्या को क्वेरिस्ट्रिंग पैरामीटर के रूप में जोड़ें, अर्थात script.js?v=1.2। (या यदि आप संस्करणों का ट्रैक नहीं रख रहे हैं, तो बस अंतिम-संशोधित समय का उपयोग करें, जो करना और भी आसान है)। यकीन नहीं होता कि क्या पिछले टिप्पणीकार का मतलब है!
चल रहा

5
संस्करण नियंत्रण के साथ हर कोई ऐसा कैसे करता है? एक वास्तविक दर्द की तरह लगता है।
शॉन

1
@ शन संस्करण-नियंत्रण के अनुसार आप <link />टैग को गतिशील रूप से प्रस्तुत कर सकते हैं और अनुप्रयोग के संस्करण को क्वेरी स्ट्रिंग पैरामीटर के रूप में इंजेक्ट कर सकते हैं। वैकल्पिक रूप से, कुछ सीएमएस में एक "क्लाइंट रिसोर्स वर्जन" होगा, जिसे सीएमएस-वाइड सेटिंग के साथ जोड़ा जाता है - साइट का एडमिन मैन्युअल रूप से उस वर्जन एनआर को बढ़ा सकता है, और सीएमएस के अपडेट भी इसे ऑटोमैटिकली अपडेट कर सकते हैं। नीचे पंक्ति: आपको गतिशील रूप से फ़ाइल URLs को प्रस्तुत करना होगा।
जीरन

103

में देखो कैश-नियंत्रण और समाप्त हो रहा है मेटा टैग।

<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>


44
यह इस मामले में बहुत मदद नहीं करेगा कि यह पहले से ही कैश हो गया है - क्योंकि इसके कैश होने के बाद, सर्वर को क्वेर नहीं किया जाएगा, और इस तरह नो कैश के साथ कोई जवाबदेही नहीं हो सकती। इसके अलावा, उस मेटा टैग को वास्तव में उपयोग नहीं किया जाना चाहिए, जैसा कि नोट कहता है, यह वेब कैश के साथ टूट जाएगा।
derobert

1
+1 क्या व्युत्पत्ति ने कहा। क्लाइंट और वेब कैश के लिए कैश पॉलिसी का सुझाव देने के लिए HTTP हेडर का उपयोग करना हमेशा बेहतर होता है, लेकिन यहां तक ​​कि कैश लोड को मजबूर करने के लिए काम नहीं करता है।

4
अपने दूसरे समाधान के लिए +1। मुझे यह समस्या है कि कुछ व्यवस्थापक द्वारा अद्यतन किए जाने के बाद ही पहली बार कैश को साफ़ किया जाना चाहिए। इस दृष्टिकोण को हल करना चाहिए कि
जूल्स कॉल

कैश को पूरी तरह से निष्क्रिय करना आमतौर पर एक बुरा विचार है।
जॉर्डन

73

अद्यतन 2012

यह एक पुराना प्रश्न है, लेकिन मुझे लगता है कि इसका उत्तर देने के लिए और अधिक आवश्यकता है क्योंकि अब वेबसाइट कैशिंग के अधिक नियंत्रण का एक तरीका है।

में ऑफलाइन वेब अनुप्रयोग (जो वास्तव में किसी भी एचटीएमएल 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 के लिए एक डिप्रेसेशन नोटिस जोड़ें


1
क्या इसका मतलब है कि आपको कैश मैनिफ़ेस्ट फ़ाइल का उपयोग और रखरखाव करना होगा?
सैम

चेतावनी: एप्लिकेशन कैश (AppCache) इंटरफ़ेस को हटा दिया गया है
cgaldiolo

59
तो, 2017 की वर्तमान सिफारिश क्या है?
गैरेट

इस विषय पर देखी जाने वाली मुख्य समस्या यह है कि जब दर्शक जिस डिवाइस का उपयोग कर रहा है वह कैश्ड संस्करणों का उपयोग करता रहता है क्योंकि उपयोगकर्ता डिवाइस की आंतरिक मेमोरी फुल हो रही है। यह पृष्ठ के कैश्ड संस्करण पर अटक जाता है और दस्तावेज़ पर किसी भी तत्व को अपडेट नहीं करता है। क्या यह केवल क्रोम में होता है ?? केवल ब्राउज़र iver ने इस पर अनुभव किया।
user2585548

4
2017: सेवा कार्यकर्ताओं का उपयोग करें।
12

27

ऐसे नहीं। ब्राउज़र को पुनः लोड करने के लिए सामग्री वितरित करते समय उपयुक्त हेडर भेजने के लिए एक विधि है:

यह सुनिश्चित करना कि सभी ब्राउज़रों में एक वेब पेज कैश नहीं है।

यदि आपकी खोज "cache header"एसओ पर यहां या कुछ इसी तरह की है, तो आपको ASP.NET विशिष्ट उदाहरण मिलेंगे।

एक और, कम साफ लेकिन कभी-कभी एक ही रास्ता अगर आप सर्वर की तरफ हेडर को नियंत्रित नहीं कर सकते हैं, तो उस संसाधन के लिए एक यादृच्छिक GET पैरामीटर जोड़ रहा है जिसे कहा जा रहा है:

myimage.gif?random=1923849839

2
फ़ाइलों को ठीक से संस्करण देना वास्तव में बेहतर है। यह बैंडविड्थ का एक बहुत बड़ा अपशिष्ट है, और, शायद अधिक महत्वपूर्ण बात, आपकी साइट को बहुत धीमा कर देती है।
derobert

8
यह वास्तव में स्थिति पर निर्भर करता है, है ना? यदि आप एक CMS प्रोग्रामिंग कर रहे हैं और यह सुनिश्चित करने की आवश्यकता है कि सभी परिवर्तित संसाधन ठीक से अपडेट हैं, तो कभी-कभी इन दो विकल्पों में से एक के आसपास कोई रास्ता नहीं है।
पेकाका

इस तरह के समाधानों को नकारात्मक में वोट दिया जाना चाहिए। यह हमारे लिए संभव है कि इंटरनेट के CO2 पदचिह्न को यथासंभव कम रखें।
टाइमिंग

14

के लिए निश्चित संसाधनों सही कैशिंग करने के लिए किया जाएगा क्वेरी पैरामीटर का उपयोग प्रत्येक तैनाती या फ़ाइल संस्करण के मूल्य के साथ। यह प्रत्येक परिनियोजन के बाद कैश साफ़ करने का प्रभाव होगा।

/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" />

विधानसभा संस्करण को अद्यतन करने के लिए मत भूलना।


इस उत्तर के लिए धन्यवाद, लेकिन कैसे करें जब हम बंडल में संसाधन जोड़ते हैं तो कृपया?
तोरगुआ

मेरे मामले में, यह "0.0.0.0" संस्करण के रूप में लौट रहा था। अपने MVC ऐप के dll का संस्करण प्राप्त करने के लिए, इसके बजाय इसका उपयोग करें:?version=@ViewContext.Controller.GetType().Assembly.GetName().Version
CGodo

1
मैंने पाया कि यह फ़ायरफ़ॉक्स और क्रोम को पूरी तरह से कंटेंट को कैच करने से रोकता है।
सैम

10

मुझे समस्या का सामना करना पड़ा और मैंने इसे हल किया:

  1. में index.htmlफ़ाइल मैं प्रकट जोड़ दिया है:

    <html manifest="cache.manifest">
  2. में <head>अनुभाग स्क्रिप्ट कैश को अद्यतन करने में शामिल हैं:

    <script type="text/javascript" src="update_cache.js"></script>
  3. में <body>खंड मैं समारोह ऑनलोड डाला है:

    <body onload="checkForUpdate()">
  4. में 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

    तब होता है क्योंकि प्रत्येक "बच्चा" फ़ाइल पृष्ठ को कैश करने का प्रयास करती है जबकि पृष्ठ पहले से ही कैश हो चुका होता है।

  5. में 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 पेज पर जाकर कैशे को अपडेट करना होगा।

समाधान के हिस्से मेरे नहीं हैं, लेकिन मैंने उन्हें इंटरनेट के माध्यम से पाया है और एक साथ रखा है ताकि यह काम करे।


क्या मुझे पता है कि CACHE.MANIFEST कहाँ लिखा गया है।
श्वेता गुलाटी

1
श्वेता गुलाटी प्रकट फ़ाइल "इंडेक्स" फ़ाइल के समान फ़ोल्डर में होनी चाहिए। समय क्या है यह काम नहीं करता है?
वोजटेक मझुरेक

1
@ श्वेतागुलाती हां, कैश HTML फाइलों में बदलाव का पता नहीं लगाता है - इसीलिए आपको मैनिफ़ेस्ट फ़ाइल में संस्करण संख्या को अपडेट करना होगा, क्योंकि यह वह है जिसे परिवर्तनों के लिए जाँचा जा रहा है। यह वास्तव में आपकी मदद करने के लिए कठिन है, क्योंकि मुझे विवरण नहीं पता है। कृपया, मुझे बताएं कि क्या आपने सभी वांछित फ़ाइलों को प्रकट करने के लिए रखा है? पथ प्रदर्शन फ़ाइल के सापेक्ष होना चाहिए। आप मुझे अपनी वेबसाइट का पता दे सकते हैं और मैं बता सकता हूं कि क्या बात है :)
वोजटेक मैजोरेक

1
@ श्वेतागुलाती यह इसलिए है क्योंकि पेज को तेजी से लोड करने के लिए ब्राउज़र कुछ फाइलों को स्वचालित रूप से कैश करता है। यह डिफ़ॉल्ट व्यवहार है और केवल ब्राउज़र पर निर्भर है ताकि आप इसे किसी भी तरह से सेट न कर सकें। विशेष रूप से js फाइलें ब्राउज़र के दायरे में होती हैं, क्योंकि वे आमतौर पर वेबसाइट पर सभी पृष्ठों पर उपयोग की जाती हैं, इसलिए उन्हें कैश करना बुद्धिमानी है। सभी फ़ाइलों को कैश करने के लिए मैनिफ़ेस्ट फ़ाइल में सभी फ़ाइल के नाम लिखने के अलावा कोई अन्य तरीका नहीं है। यदि आपको कोई मिल जाए, तो मुझे बताएं, क्योंकि मुझे इसकी भी आवश्यकता है :)
वोजटेक माजुरेक

1
आपकी फ़ाइलों के लिए पूर्ण पथ कोई फर्क नहीं पड़ता। एड्रैस मामलों के कारण से संबंधित मार्ग ब्राउज़र फ़ाइलों के लिए अनुरोध भेजता है। F.ex: मेरे पास domain example.com है और यह serwer names.com पर है। इस पर मेरा स्थान example.names.com है। इसलिए मैं अपने example.com डोमेन को अपने सर्वर स्पेस example.names.com में redirect के रूप में शामिल करता हूँ। ऐसा करने के लिए मुझे इस रीडायरेक्ट के लक्ष्य के रूप में फ़ोल्डर सेट करने की आवश्यकता है। इसलिए यदि मैं example.names.com पर कई साइटें रखना चाहता हूं, तो मैं फ़ोल्डर "name1" बनाता हूं, इसे रीडायरेक्ट करता हूं और सभी फाइलों को अंदर रख देता हूं। रास्ते यहीं से गिने जाते हैं। अगर मेरे पास name1 \ script \ test.js है तो मैनिफ़ेस्ट फ़ाइल में मैं script \ test.js लिखता हूँ।
वोजटेक मझुरेक

7

मेरे पास एक मामला था जहां मैं ग्राहकों की तस्वीरें ऑनलाइन ले जाऊंगा और अगर एक तस्वीर बदल दी जाए तो उसे अपडेट करना होगा। ब्राउज़र अभी भी पुरानी तस्वीर दिखा रहा था। इसलिए मैंने एक यादृच्छिक जीईटी चर को कॉल करने की हैक का उपयोग किया, जो हर बार अद्वितीय होगा। यहाँ यह है अगर यह किसी को भी मदद कर सकता है

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

संपादित करें जैसा कि दूसरों ने बताया है, निम्नलिखित बहुत अधिक कुशल समाधान है क्योंकि यह केवल छवियों को फिर से लोड करेगा जब वे बदल जाते हैं, फ़ाइल आकार द्वारा इस परिवर्तन की पहचान करना:

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

29
यह सभी के सुंदर नहीं है, यह साइट पुनः लोड छवि हर बार समय डाउनलोड संसाधनों का एक बहुत बर्बाद कर देते थे और एक बेहतर समाधान का उपयोग करने के होगा फ़ाइल आकार एक यादृच्छिक संख्या के बजाय, इस कैश केवल दोबारा सत्यापित जब फ़ाइल वास्तव में कर देगा परिवर्तन
रॉबर्टो अरोसेमना

8
या इमेज बाइट्स का हैश
टेलर एड्मिस्टन

1
यह सब एक उपयोगकर्ता की आवश्यकताओं पर निर्भर करता है। बड़ी संख्या में फ़ोटो परिदृश्य कुछ फ़ोटो से भिन्न होंगे। फ़ाइल आकार की जाँच करने से बैंडविड्थ की बचत होती है, लेकिन अतिरिक्त प्रसंस्करण, संभावित रूप से पृष्ठ लोड धीमा करना भी शामिल होगा। मेरे मामले में जहां तस्वीरें बहुत बार बदल रही थीं और यह महत्वपूर्ण व्यवसाय निर्णय था कि उपयोगकर्ता को सबसे अधिक अपडेट मिलेगा, यह एक सही समाधान था।
जीशान

आप इसे कॉन्फ़िगरेशन में एक स्थिर मूल्य बना सकते हैं, यह किसी भी तरह से आदर्श दृष्टिकोण नहीं है।
सेर

3
<img src = "/ photos / userid_73.jpg? संशोधित = <? = filemtime (" / फ़ोटो / userid_73.jpg ")?>" "अधिक उपयोगी होगा!
फुस्का सॉफ्टवेयर

4

बहुत सारे उत्तर इस बिंदु को याद कर रहे हैं - अधिकांश डेवलपर्स अच्छी तरह से जानते हैं कि कैश को बंद करना अक्षम है। हालांकि, कई सामान्य परिस्थितियां हैं जहां दक्षता महत्वहीन है और डिफ़ॉल्ट कैश व्यवहार बुरी तरह से टूट गया है।

इनमें नेस्टेड, इटेरेटिव स्क्रिप्ट टेस्टिंग (बड़ा वाला!) और टूटी हुई थर्ड पार्टी सॉफ्टवेयर वर्कअराउंड शामिल हैं। यहां दिए गए समाधानों में से कोई भी ऐसे सामान्य परिदृश्यों को संबोधित करने के लिए पर्याप्त नहीं है। अधिकांश वेब ब्राउज़र बहुत अधिक आक्रामक कैशिंग हैं और इन समस्याओं से बचने के लिए कोई समझदार साधन प्रदान नहीं करते हैं।



2

मेरे लिए निम्न कार्यों के लिए URL अपडेट करना:

/custom.js?id=1

बाद में एक अद्वितीय संख्या जोड़कर ?id=और नए परिवर्तनों के लिए इसे बढ़ाकर, उपयोगकर्ताओं को प्रेस करने की आवश्यकता नहीं हैCTRL + F5 को कैश ताज़ा करने के करने की । वैकल्पिक रूप से, आप वर्तमान समय या उसके बाद के युग के हैश या स्ट्रिंग संस्करण को जोड़ सकते हैं?id=

कुछ इस तरह ?id=1520606295


1

यहां 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

1

यकीन नहीं है कि अगर यह वास्तव में आपकी मदद कर सकता है, लेकिन यह है कि किसी भी ब्राउज़र पर कैशिंग को कैसे काम करना चाहिए। जब ब्राउज़र एक फ़ाइल का अनुरोध करता है, तो उसे हमेशा सर्वर को एक अनुरोध भेजना चाहिए जब तक कि "ऑफ़लाइन" मोड न हो। सर्वर कुछ पैरामीटर्स को पढ़ेगा जैसे डेट मॉडिफाइड या ईटैग्स।

सर्वर 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 सेंट!


1

मैंने इस सरल समाधान को लागू किया जो मेरे लिए काम करता है (उत्पादन वातावरण पर अभी तक नहीं):

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 से पिछले संस्करण में बदलते हैं तो कैश से लोड हो जाएगा, तो इसका मतलब है कि कैश फ्लश नहीं किया गया है, पिछले सभी संस्करणों को कैश में रखते हुए)।

मैं थोड़ा नौसिखिया हूँ और मैं यह सुनिश्चित करने के लिए कि आपके तरीके एक अच्छा तरीका है, अपने पेशेवर जाँच और समीक्षा के बारे में बताएं।

आशा करता हूँ की ये काम करेगा।


0

कैश-कंट्रोल सेट करने के अलावा: नो-कैश, आपको एक्सपायर हेडर को भी -1 पर सेट करना चाहिए, यदि आप चाहें तो स्थानीय कॉपी को हर बार रिफ्रेश किया जा सकता है (आईई के कुछ वर्जन की आवश्यकता होती है)।

HTTP कैश देखें - सर्वर से जांच करें, हमेशा If-Modified-चूंकि भेज रहा है


0

एक चाल है जिसका उपयोग किया जा सकता है। चाल को स्क्रिप्ट टैग में फ़ाइल नाम के पैरामीटर / स्ट्रिंग को जोड़ना है और फ़ाइल बदलने पर इसे बदलना है।

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

ब्राउज़र पूरे स्ट्रिंग को फ़ाइल पथ के रूप में व्याख्या करता है, भले ही "के बाद आता है?" पैरामीटर हैं। तो अब ऐसा होता है कि अगली बार जब आप अपनी फ़ाइल को अपडेट करते हैं, तो बस अपनी वेबसाइट (उदाहरण <script src="myfile.js?version=1.0.1"></script>) पर स्क्रिप्ट टैग में नंबर बदलें और प्रत्येक उपयोगकर्ता ब्राउज़र देखेगा कि फ़ाइल बदल गई है और एक नई प्रतिलिपि ले सकती है।


0

कैश साफ़ करने या सही डेटा पुनः लोड करने के लिए फोर्स ब्राउज़र?मैंने स्टैकओवरफ्लो में वर्णित अधिकांश समाधानों की कोशिश की है, कुछ काम करते हैं, लेकिन थोड़ी देर के बाद, यह अंततः कैश करता है और पिछली भरी हुई स्क्रिप्ट या फ़ाइल को प्रदर्शित करता है। वहाँ एक और तरीका है जो कैश (सीएसएस, जेएस, आदि) को साफ करेगा और वास्तव में सभी ब्राउज़रों पर काम करेगा?

मैंने अब तक पाया कि यदि आप सर्वर पर अपनी फाइलों पर तारीख और समय को बदलते हैं तो विशिष्ट संसाधन व्यक्तिगत रूप से पुनः लोड किए जा सकते हैं। "कैश को साफ़ करना" उतना आसान नहीं है जितना इसे होना चाहिए। अपने ब्राउज़रों पर कैश को साफ़ करने के बजाय, मैंने महसूस किया कि कैश की गई सर्वर फ़ाइलों को "टच" करने से सर्वर पर कैश्ड सोर्स फ़ाइल की तारीख और समय बदल जाएगा (एज, क्रोम और फ़ायरफ़ॉक्स पर परीक्षण) और अधिकांश ब्राउज़र अपने आप सबसे डाउनलोड हो जाएंगे आपके सर्वर पर व्हाट्स की वर्तमान ताज़ा प्रतिलिपि (कोड, ग्राफिक्स किसी भी मल्टीमीडिया)। मेरा सुझाव है कि आप सर्वर पर सबसे वर्तमान स्क्रिप्ट को कॉपी करें और अपने कार्यक्रम को चलाने से पहले "टच द चीज़" समाधान करें, इसलिए यह आपकी सभी समस्या फ़ाइलों की तारीख को एक वर्तमान तिथि और समय में बदल देगा, फिर यह एक नई प्रतिलिपि डाउनलोड करता है अपने ब्राउज़र पर:

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

फिर ... आपके कार्यक्रम के बाकी ...

इस समस्या को हल करने में मुझे कुछ समय लगा (क्योंकि कई ब्राउज़र अलग-अलग कमांड के लिए अलग-अलग कार्य करते हैं, लेकिन वे सभी फाइलों का समय जाँचते हैं और आपके ब्राउज़र में आपकी डाउनलोड की गई कॉपी की तुलना करते हैं, यदि अलग-अलग तारीख और समय, ताज़ा करेंगे), यदि आप माना जाता है कि सही तरीके से नहीं जा सकता, वहाँ हमेशा एक और प्रयोग करने योग्य और बेहतर समाधान है। सर्वश्रेष्ठ सादर और खुश शिविर। वैसे स्पर्श (); या विकल्प कई प्रोग्रामिंग भाषाओं में जावास्क्रिप्ट बाश श php में शामिल हैं और आप उन्हें html में शामिल या कॉल कर सकते हैं।


1
यदि फ़ाइल को संशोधित किया गया है तो टाइमस्टैम्प पहले से ही बदल दिया गया है, इसलिए इसे फिर से चालू करने का कोई लाभ नहीं है।
फुस्का सॉफ्टवेयर

टच कमांड फाइल को बिल्कुल भी नहीं बदलता है। यह दिनांक और समय की विशेषता को बदल देता है, इसे नए संस्करण में परिवर्तित करने के लिए ब्राउज़र को मूर्ख बनाता है और इसे नई प्रतिलिपि के रूप में डाउनलोड करता है।
लुइस एच कैब्रेजो

-1

क्या आप कैश साफ़ करना चाहते हैं, या बस यह सुनिश्चित करें कि आपका करंट (बदला हुआ?) पेज कैश नहीं है?

यदि उत्तरार्द्ध, यह उतना ही सरल होना चाहिए जितना कि

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

मैंने हाल ही में क्रोम पोस्टिंग में इस दृष्टिकोण के बारे में पढ़ा, और मुझे केवल फ़ायरफ़ॉक्स 3.6 के साथ मुट्ठी भर लाइव सर्वर, लोकलहोस्ट और विंडोज फाइलशेयर पर लगातार परिणाम मिले।
danjah
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.