पैरामस के माध्यम से कैश बस्टिंग


122

हम प्रोडक्शन डिप्लॉयज पर बस्ट को कैश करना चाहते हैं, लेकिन ऐसा करने के लिए सिस्टम का पता लगाने वाले बल्ले से समय का एक गुच्छा बर्बाद न करें। मेरा विचार था कि वर्तमान संस्करण संख्या के साथ सीएसएस और जेएस फाइलों के अंत में एक परम लागू किया जाए:

<link rel="stylesheet" href="base_url.com/file.css?v=1.123"/>

दो प्रश्न: क्या यह प्रभावी रूप से कैश को तोड़ देगा? क्या परम ब्राउज़र ब्राउज़र का कारण बनेगा, तो उस url से प्रतिक्रिया को कभी कैश न करें क्योंकि परमैम इंगित करता है कि यह गतिशील सामग्री है?

जवाबों:


115

परम ?v=1.123एक क्वेरी स्ट्रिंग को इंगित करता है, और इसलिए ब्राउज़र सोचेंगे कि यह एक नया मार्ग है, कहते हैं ?v=1.0,। इस प्रकार यह फ़ाइल से लोड करने का कारण बनता है, कैश से नहीं। जैसा तुम चाहो।

और, ब्राउज़र यह मान लेगा कि आपके द्वारा कॉल किए जाने पर स्रोत अगली बार वही रहेगा ?v=1.123और उसे उस स्ट्रिंग से कैश करना चाहिए । तो यह कैश्ड रहेगा, हालाँकि आपका सर्वर तब तक सेट है, जब तक आप आगे बढ़ते हैं ?v=1.124


4
स्टीव सॉडर्स का हवाला देते हुए: "लोकप्रिय परदे के पीछे से कैशिंग का लाभ पाने के लिए, एक querystring के साथ खुलासा करने से बचें और इसके बजाय फ़ाइल नाम को संशोधित करें।" पूरा विवरण यहां पाया जा सकता है: stevesouders.com/blog/2008/08/23/…
lao

25
वह ब्लॉग पोस्ट अब एक दशक पुरानी हो रही है। क्या आपको लगता है कि कैश प्रदाताओं और सीडीएन को अभी तक इसे समायोजित करना है? स्क्वीड अब क्वेरी स्ट्रिंग के साथ दस्तावेज़ों को कैश करने में सक्षम लगता है ।
जेटी

1
शायद यह किसी को मदद करता है: व्यक्तिगत रूप से, मैं फ़ाइल संशोधन टाइमस्टैम्प का उपयोग 'स्वचालित' संस्करण पैरामीटर के रूप में करता हूं, उदाहरण के लिए। <link rel="stylesheet" href="style.css?v=1487935578" />
oelna

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

36

दो प्रश्न: क्या यह प्रभावी रूप से कैश को तोड़ देगा?

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

क्या परम ब्राउज़र ब्राउज़र का कारण बनेगा, तो उस url से प्रतिक्रिया को कभी कैश न करें क्योंकि परमैम इंगित करता है कि यह गतिशील सामग्री है?

नहीं, पैरामीटर कैशिंग नीति नहीं बदलेगा; सर्वर द्वारा भेजे गए कैशिंग हेडर अभी भी लागू होते हैं, और अगर यह किसी को नहीं भेजता है, तो ब्राउज़र की चूक।


1
@spender मुझे अभी संदर्भ नहीं मिल रहा है मुझे डर है, एक लंबा ब्लॉग लेख या एसओ जवाब था जहां जेफ एटवुड इसके बारे में बात करता है (IIRC)
पेकका

2
@spender मैंने पढ़ा है कि कैचिंग करते समय कुछ स्ट्रिंग सर्वर (या तो पुराने हैं, या कॉन्फ़िगर किए जा सकते हैं) क्वेरी स्ट्रिंग को अनदेखा कर सकते हैं।
MrWhite

2
@spender - मैंने वही सुना है, और मुझे लगता है कि फ़ाइल नाम बदलना, या रास्ता सबसे अच्छा विकल्प है। उदाहरण के लिए /static/v22/file.css, जैसे कि आप एक फोल्डर का नाम बदलने के साथ कई फाइलें कर सकते हैं, जैसे /static/v23/file.css/static/v23/mystuff.js
ब्रैड पार्क्स

22

संस्करण संख्या को वास्तविक फ़ाइल नाम में रखना अधिक सुरक्षित है। यह कई संस्करणों को एक बार में मौजूद करने की अनुमति देता है ताकि आप एक नया संस्करण रोल आउट कर सकें और यदि कोई भी HTML संस्करण अभी भी मौजूद हैं जो पुराने संस्करण का अनुरोध कर रहे हैं, तो उन्हें वह संस्करण मिलेगा जो उनके HTML के साथ काम करता है।

ध्यान दें, इंटरनेट पर कहीं भी सबसे बड़े संस्करण की तैनाती में, jQuery वास्तविक फ़ाइल नाम में संस्करण संख्याओं का उपयोग करता है और यह कई संस्करणों को बिना किसी विशेष सर्वर-साइड तर्क के सह-अस्तित्व में रखने की अनुमति देता है (प्रत्येक संस्करण सिर्फ एक अलग फ़ाइल है)।

जब आप नए पृष्ठ और नई लिंक्ड फ़ाइलें (जो आप चाहते हैं) को तैनात करते हैं और तब से उन संस्करणों पर प्रभावी ढंग से कैश किया जा सकता है (जो आप भी चाहते हैं) जब यह कैश को बस्ट करता है।


मैं इससे सहमत हूं, लेकिन सिनात्रा एपेंड करना बहुत आसान है? V = <% = VERSION%> सभी सीएसएस और जेएस अनुरोधों के लिए बनाम हर फाइल को व्यक्तिगत रूप से नियंत्रित करने के लिए। आखिरकार हम सिनट्रा-एसेटपैक पर स्विच करेंगे, जो सभी फाइलों को प्री-प्रोसेस और कंप्रेस करेगा और वास्तव में # फाइलनाम के लिए एक वर्जन देगा, जो तब हमें व्यक्तिगत रूप से बहुत आसान तरीके से नियंत्रित करने देगा।
ब्रैड हर्मन

1
यदि आप 10000% सुनिश्चित करना चाहते हैं, तो मैं फ़ाइल नाम में संस्करण संख्या डालना सबसे सुरक्षित उपाय हूं, लेकिन मैं "एकाधिक संस्करणों को एक बार में" तर्क का पालन नहीं करना चाहता। क्वेरी पैरामीटर वाला URL, भिन्न क्वेरी पैरामीटर वाले URL से भिन्न होता है। उन्हें क्लाइंट द्वारा दो अलग-अलग संसाधनों के रूप में माना जाना चाहिए; यदि वे नहीं हैं, तो ग्राहक टूट गया है।
पेका

2
@Pekka - संस्करण संख्या चीज़ एक से अधिक संस्करणों को एक साथ मौजूद होने की अनुमति दे सकती है, लेकिन इसके लिए क्वेरी पैरामीटर को सही वास्तविक फ़ाइल में मैप करने के लिए सर्वर सहयोग की आवश्यकता होती है। मुझे नहीं लगता है कि ओपी यहां क्या कर रहा है और फाइलन को संशोधित करते समय उस जटिलता की आवश्यकता के लिए बहुत कम कारण है और कोई सर्वर सहयोग की आवश्यकता नहीं है। जाहिर है दोनों काम कर सकते हैं।
१२

11

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

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


9

यह कैश को एक बार बंद कर देगा, ग्राहक द्वारा संसाधन डाउनलोड करने के बाद जब तक ग्राहक कैश से हर दूसरी प्रतिक्रिया नहीं देंगे:

  1. v पैरामीटर अपडेट किया गया है।
  2. ग्राहक अपना कैश साफ़ करता है

6

सामान्य तौर पर यह ठीक होना चाहिए, लेकिन इसके लिए यह संभव है कि यदि कोई मध्यवर्ती कैश (एक प्रॉक्सी) है तो यह काम नहीं करता है जो अनुरोध पैरामीटरों को अनदेखा करने के लिए कॉन्फ़िगर किया गया है।

उदाहरण के लिए, यदि आप अकामाई सीडीएन के माध्यम से स्थिर सामग्री परोस रहे हैं, तो इस पद्धति का उपयोग करके कैश को रोकने के लिए अनुरोध मापदंडों को अनदेखा करने के लिए इसे कॉन्फ़िगर किया जा सकता है।


5

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


5
स्टीव सॉडर लेख में उल्लिखित स्क्वीड प्रॉक्सी ने उनकी डिफ़ॉल्ट कैशिंग नीति को बदल दिया है। संस्करण 2.7 (मई 2008) और संस्करण 3.1 (मार्च 2010) के बाद से, डिफ़ॉल्ट व्यवहार गतिशील सामग्री को कैश करना है।
जोश रैक

5

यहां 2 तकनीकों (क्वेरी स्ट्रिंग बनाम फ़ाइल नाम) की तुलना करें :

एक querystring के रूप में संस्करण में दो समस्याएं हैं।

सबसे पहले, यह हमेशा एक ब्राउज़र नहीं हो सकता है जो कैशिंग को लागू करता है जिसके माध्यम से हमें बस्ट करने की आवश्यकता होती है। यह कहा जाता है कि निश्चित (संभवतः पुराने) परदे के पीछे उनके कैशिंग व्यवहार के संबंध में झगड़े को अनदेखा करते हैं।

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


4

फ़ाइलों की सेवा करते समय पथ के भाग को अनदेखा करने के लिए htaccess mod_rewrite का उपयोग करने का एक और समान तरीका है । आपका कभी भी कैश नहीं किया गया अनुक्रमणिका पृष्ठ फ़ाइलों के नवीनतम पथ को संदर्भित करता है।

एक विकास के नजरिए से यह संस्करण संख्या के लिए परम का उपयोग करना जितना आसान है, लेकिन यह फ़ाइल नाम के रूप में उतना ही मजबूत है।

संस्करण संख्या के लिए पथ के उपेक्षित भाग का उपयोग करें, और सर्वर इसे अनदेखा करता है और बिना पढ़े फ़ाइल परोसता है।

1.2.3/css/styles.csscss/styles.cssपहली निर्देशिका छीनने और htaccess फ़ाइल द्वारा अनदेखा किए जाने के बाद से उसी फ़ाइल पर कार्य करता है

सहित संस्करण फ़ाइलें

<?php
  $version = "1.2.3";
?>

<html>
  <head>
    <meta http-equiv="cache-control" content="max-age=0" />
    <meta http-equiv="cache-control" content="no-cache" />
    <meta http-equiv="expires" content="0" />
    <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
    <meta http-equiv="pragma" content="no-cache" />
    <link rel="stylesheet" type="text/css" href="<?php echo $version ?>/css/styles.css">
  </head>
  <body>
    <script src="<?php echo $version ?>/js/main.js"></script>
  </body>
</html>

ध्यान दें कि इस दृष्टिकोण का अर्थ है कि आपको अपने सूचकांक पृष्ठ के कैशिंग को अक्षम करना होगा - सभी ब्राउज़रों में कैशिंग बंद करने के लिए <मेटा> टैग का उपयोग करना?

.htaccess फ़ाइल

RewriteEngine On

# if you're requesting a file that exists, do nothing
RewriteCond %{REQUEST_FILENAME} !-f 
# likewise if a directory that exists, do nothing
RewriteCond %{REQUEST_FILENAME} !-d 

# otherwise, rewrite foo/bar/baz to bar/baz - ignore the first directory
RewriteRule ^[^/]+/(.+)$ $1 [L] 

आप किसी भी सर्वर प्लेटफ़ॉर्म पर वही दृष्टिकोण ले सकते हैं जो url पुनर्लेखन की अनुमति देता है

(फिर से लिखने हालत से अनुकूलित mod_rewrite - क्वेरी स्ट्रिंग को छोड़कर / # करने के लिए फिर से लिखने निर्देशिका / )

... और अगर आपको अपने अनुक्रमणिका पृष्ठ / साइट प्रविष्टि बिंदु के लिए कैश बस्टिंग की आवश्यकता है , तो आप इसे ताज़ा करने के लिए हमेशा JavaSript का उपयोग कर सकते हैं ।


2
<script type="text/javascript">
// front end cache bust

var cacheBust = ['js/StrUtil.js', 'js/protos.common.js', 'js/conf.js', 'bootstrap_ECP/js/init.js'];   
for (i=0; i < cacheBust.length; i++){
     var el = document.createElement('script');
     el.src = cacheBust[i]+"?v=" + Math.random();
     document.getElementsByTagName('head')[0].appendChild(el);
}
</script> 

नए रिलीज के विकास / परीक्षण के दौरान, कैश एक समस्या हो सकती है क्योंकि ब्राउज़र, सर्वर और यहां तक ​​कि कभी-कभी 3 जी टेल्को (यदि आप मोबाइल परिनियोजन करते हैं) स्थिर सामग्री (जैसे जेएस, सीएसएस, एचटीएमएल, आईएमजी) को कैश करेंगे। आप संस्करण संख्या, रैंडम संख्या या टाइमस्टैम्प को URL पर जोड़कर इससे पार पा सकते हैं जैसे: JSP: <script src = "js / excel.js? Time = <% = new java.util.Date ()%>> </? स्क्रिप्ट> यदि आप शुद्ध HTML चला रहे हैं (सर्वर पेज JSP, ASP, PHP के बजाय) तो सर्वर आपकी मदद नहीं करेगा। ब्राउज़र में, लिंक JS रन से पहले लोड किए जाते हैं, इसलिए आपको लिंक हटाने होंगे और उन्हें JS से लोड करना होगा
Conete Cristian

मुझे नहीं लगता कि यह जेएस फाइलों को क्रम में, समकालिक रूप से लोड करेगा।
चुपके रब्बी

0
 <script>
    var storedSrcElements = [
         "js/exampleFile.js",
         "js/sampleFile.js",
         "css/style.css"
          ];

    var head= document.getElementsByTagName('head')[0];
    var script;
    var link;
    var versionNumberNew = 4.6;

    for(i=0;i<storedSrcElements.length;i++){
     script= document.createElement('script');
     script.type= 'text/javascript';
     script.src= storedSrcElements[i] + "?" + versionNumberNew;
     head.appendChild(script);
    }     


     </script> 


       ### Change the version number  (versionNumberNew) when you want the new files to be loaded  ###

0

आशा है कि यह आपको बाहरी जेएस फ़ाइल को इंजेक्ट करने में मदद करेगा

<script type="text/javascript"> 
var cachebuster = Math.round(new Date().getTime() / 1000); 
document.write('<scr'+'ipt type="text/javascript" src="external.js?cb=' +cachebuster+'"></scr' + 'ipt>');
</script>

स्रोत - जावास्क्रिप्ट में कैशेबस्टर कोड

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.