IIS7 कैश-नियंत्रण


95

मैं कुछ ऐसा करने की कोशिश कर रहा हूं जो मुझे लगता है कि काफी सरल होगा। ग्राहकों को यह बताने के लिए IIS 7 प्राप्त करें कि वे निश्चित समय के लिए मेरी साइट पर सभी छवियों को कैश कर सकते हैं, चलो 24 घंटे कहते हैं।

मैंने http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx पर कदम उठाने की कोशिश की है, लेकिन कोई फायदा नहीं हुआ। मुझे अभी भी अनुरोध मिल रहा है कि 304 के साथ सर्वर को वापस किया जाए।

क्या किसी के पास ऐसा करने का कोई तरीका है? मेरे पास एक रेखीय रूप से गहन साइट है और मेरे उपयोगकर्ताओं को हर बार एक पृष्ठ का अनुरोध करने पर (इसलिए मेरा सर्वर है) अंकित किया जा रहा है। अजीब तरह से छवियों को "कैश-कंट्रोल निजी, अधिकतम-आयु = 3600" लगता है जो फायरबग में दिखा रहा है लेकिन जब मैं F5 दबाता हूं तो ब्राउज़र अभी भी उनसे अनुरोध कर रहा है।

जवाबों:


124

यदि आप कैश-कंट्रोल हैडर सेट करना चाहते हैं, तो ऐसा करने के लिए IIS7 UI में कुछ भी नहीं है, दुख की बात है।

हालाँकि आप इस web.config को उस फ़ोल्डर या साइट की जड़ में छोड़ सकते हैं जहाँ आप इसे सेट करना चाहते हैं:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

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

आप IIS7 मेटाबेस को इस तरह संपादित करके भी ऐसा कर सकते हैं appcmd.exe:

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  सेट "डिफ़ॉल्ट वेब साइट / फ़ोल्डर" 
  -section: system.webServer / staticContent 
  -clientCache.cacheControlMode: UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  सेट "डिफ़ॉल्ट वेब साइट / फ़ोल्डर" 
  -section: system.webServer / staticContent 
  -clientCache.cacheControlMaxAge: "7.00: 00: 00"

5
स्थैतिक विन्यास तत्व के लिए MSDN प्रलेखन यहां पाया जा सकता है: msdn.microsoft.com/en-us/library/ms689443.aspx
मिलान गार्डियन

4
नीचे 360Airwalk पोस्ट देखें, IIS7 में इसके लिए UI है
ChadT

बस एक जानकारी के रूप में: यह सेटिंग बिल्ट-इन डेवलपमेंट सर्वर (VS 2010 SP1 का कम से कम) पर कोई प्रभाव नहीं पड़ता है। यदि संदेह है कि यह काम क्यों नहीं करता है, तो IIS के साथ जांचें।

6
हाय जेफ, क्या आप अलग-अलग माइम-प्रकार या फ़ाइलों के एक्सटेंशन के लिए अलग Cache-Control( max-age) हेडर की सेवा करने के बारे में जानते हैं ?
जैस्पर

@ जेफ एटवुड शायद आप मेरी मदद कर सकते हैं। इसे देखें: stackoverflow.com/questions/57990579/…
सक्सेस मैन

115

यह सच नहीं है जेफ।

आपको बस अपने IIS 7 मैनेजर UI (उदाहरण छवियाँ या ईवेंट डिफ़ॉल्ट वेब अनुप्रयोग फ़ोल्डर) के भीतर एक फ़ोल्डर का चयन करना होगा और फिर "HTTP रिस्पांस हेडर्स" पर क्लिक करना होगा। फिर आपको दाहिने फलक में "सेट आम हैडर .." पर क्लिक करना है और "वेब सामग्री समाप्त करें" चुनें। वहां आप "आफ्टर:" चुनकर अधिकतम 24 घंटे की आयु आसानी से कॉन्फ़िगर कर सकते हैं, पाठ बॉक्स में "24" दर्ज कर सकते हैं और कॉम्बोक्स में "घंटे" चुन सकते हैं।

Web.config प्रविष्टि के संबंध में आपका पहला पैराग्राफ सही है। मैं कैश कंट्रोल हेडर को "सार्वजनिक" या उस मामले में जो कुछ भी आवश्यक हो, सेट करने के लिए cacheControlCustom- विशेषता जोड़ दूंगा।

आप निश्चित रूप से आवश्यकतानुसार web.config प्रविष्टियाँ (या फ़ाइलें) प्रदान करके प्राप्त कर सकते हैं।

संपादित करें: एक भ्रामक वाक्य हटा दिया :)


1
इस सेटिंग के लिए UI भयानक है। लेकिन यह समझाने के लिए धन्यवाद कि वहां कैसे पहुंचा जाए! +1
बिली कोवर

यह इंटरफ़ेस उसी कॉन्फ़िगरेशन के साथ web.config बनाता है जैसा कि जेफ ने पोस्ट किया है। जानकर अच्छा लगा! धन्यवाद!
RandyMorris

2
@ 360Airwalk पोस्ट के लिए धन्यवाद। क्या आप अलग-अलग माइम-प्रकार या फ़ाइल एक्सटेंशन के लिए भिन्न Cache-Control( max-age) शीर्षलेखों की सेवा करने के बारे में जानते हैं ?
जैस्पर

3
@ जैस्पर: आप इसे प्रति फ़ोल्डर उदाहरण के लिए सेट कर सकते हैं। यदि आप किसी फ़ोल्डर सबफ़ोल्डर पर कैशे-नियंत्रण सेट करते हैं, तो सेटिंग को इनहेरिट किया जाएगा, लेकिन आप इसे फिर से और इतने पर ओवरराइड कर सकते हैं। आप इसे प्रति फ़ाइल के आधार पर भी कर सकते हैं। यदि आप आईआईएस कंसोल का उपयोग नहीं कर सकते हैं तो आप इसे web.config के माध्यम से भी कर सकते हैं। बाद के लिए इस पोस्ट को देख stackoverflow.com/questions/2195266/...
360Airwalk

27

मैं इसका उपयोग करता हूं

<staticContent>
<clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="500.00:00:00" />
</staticContent>

सार्वजनिक कैश-कंट्रोल हेडर के साथ 500 दिनों के लिए स्थिर सामग्री को कैश करने के लिए।


10
अनुशंसित अभ्यास 1 वर्ष है अनिवार्य रूप से 365 दिन और नहीं।
आइचो

5
500 दिन BAD है, कि लेख एक RFC नियम के बारे में बात करता है जो 1 वर्ष से अधिक के डेवलपर्स को कैश सेट नहीं करने के लिए कहता है। SEOspeed/docs/best-practices/caching भविष्य में इसे एक वर्ष से अधिक के लिए सेट न करें। , जैसा कि RFC दिशानिर्देशों का उल्लंघन करता है।
foxontherock

@foxontherock किसी भी तरह से आप 365 दिनों के बुरे अभ्यास के RFC नियम को प्रमाणित कर सकते हैं? मुझे प्रलेखन में यह सुझाव देने के लिए कुछ भी नहीं मिला ...
पेसानो 220 एनएक्स

@Elmer शायद आप मेरी मदद कर सकते हैं। इसे देखें: stackoverflow.com/questions/57990579/…
सक्सेस मैन

19

F5 रीफ़्रेश में "वर्तमान HTML और इसके प्रत्यक्ष निर्भरता को फिर से लोड करने" का शब्दार्थ है । इसलिए आपको HTML द्वारा सीधे संदर्भित किसी भी imgs, css और js संसाधन को देखने की उम्मीद करनी चाहिए। बेशक एक 304 इस के लिए एक स्वीकार्य प्रतिक्रिया है लेकिन F5 ताज़ा तात्पर्य है कि ब्राउज़र ताजा कैश सामग्री पर भरोसा करने के बजाय अनुरोध करेगा।

इसके बजाय बस कहीं और नेविगेट करने और फिर वापस नेविगेट करने की कोशिश करें।

अधिकांश ब्राउज़रों में f5 दबाते हुए ctrl को दबाकर, आप एक रिफ़र को पिछले, एक 304 को बाध्य कर सकते हैं।


18

एल्मर के जवाब को लागू करना, क्योंकि मेरा संपादन वापस ले लिया गया था।

सार्वजनिक कैश-कंट्रोल हेडर के साथ 365 दिनों के लिए स्थिर सामग्री को कैश करने के लिए , आईआईएस को निम्नलिखित के साथ कॉन्फ़िगर किया जा सकता है

<staticContent>
    <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
</staticContent>

यह इस तरह एक हेडर में अनुवाद करेगा:

Cache-Control: public,max-age=31536000

ध्यान दें कि अधिकतम आयु सेकंड में एक डेल्टा है, एक सकारात्मक 32 बिट पूर्णांक द्वारा व्यक्त किया जा रहा है जैसा कि आरएफसी 2616 अनुभाग 14.9.3 और 14.9.4 में कहा गया है । यह 2 ^ 31 या 2,147,483,648 सेकंड (68 वर्ष से अधिक) का अधिकतम मूल्य दर्शाता है। हालांकि, क्लाइंट और सर्वर के बीच संगतता सुनिश्चित करने के लिए, हम अनुशंसित अधिकतम 365 दिन (एक वर्ष) अपनाते हैं।

जैसा कि अन्य उत्तरों में बताया गया है, आप इन निर्देशों का उपयोग सभी स्थिर सामग्री के लिए अपनी साइट के web.config पर भी कर सकते हैं। एक विकल्प के रूप में, आप इसे केवल एक विशिष्ट स्थान में सामग्री के लिए उपयोग कर सकते हैं (नमूना पर, "सीडीएन" फ़ोल्डर में सामग्री के लिए 30 दिनों के सार्वजनिक कैश):

<location path="cdn">
   <system.webServer>
        <staticContent>
             <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/>
        </staticContent>
   </system.webServer>
</location>

लुसियानो, मैं आपके तरीके का उपयोग करके मेरी छवियों को कैश करने की कोशिश कर रहा हूं। अब जब मैं HttpFox का उपयोग करके विश्लेषण करता हूं तो मुझे प्रत्येक छवि के लिए 2 अनुरोध दिखाई देते हैं। 1. पहले एक (NS_BINDING_ABORTED) त्रुटि के साथ एक संक्षिप्त परिणाम देता है 2. दूसरा अनुरोध एक कैश्ड छवि है। कोई विचार?
मिथिला

1

एक आसान तरीका है: 1. वेबसाइट के web.config का उपयोग करते हुए 2. "staticContent" अनुभाग में विशिष्ट फ़ाइल को हटा दें और mimeMap जोड़ें 3. "clientCache" जोड़ें

<configuration>
  <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    <staticContent>
      <remove fileExtension=".ipa" />
      <remove fileExtension=".apk" />
      <mimeMap fileExtension=".ipa" mimeType="application/iphone" />
      <mimeMap fileExtension=".apk" mimeType="application/vnd.android.package-archive" />
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="777.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.