HTTP स्थिति कोड 200 (कैश) बनाम स्थिति कोड 304 के बीच क्या अंतर है?


201

मैं अपनी वेब साइट का उपयोग करने के लिए फ़ायरफ़ॉक्स के लिए Google "पेज स्पीड" प्लग-इन का उपयोग कर रहा हूं।

मेरे पृष्ठ के कुछ घटकों को HTTP स्थिति के रूप में दर्शाया गया है:

200 200 (कैश) 304

Google की "पेज स्पीड" द्वारा।

जो मैं उलझन में हूं वह 200 (कैश) और 304 के बीच का अंतर है।

मैंने पृष्ठ को कई बार ताज़ा किया है (लेकिन मेरे कैश को साफ़ नहीं किया है) और यह हमेशा लगता है कि मेरे favicon.ico और कुछ चित्र स्थिति = 200 (कैश) हैं जबकि कुछ अन्य छवियां http स्थिति 304 हैं।

मुझे समझ नहीं आता कि अंतर क्यों है।

अद्यतन :

Google "पेज स्पीड" का उपयोग करते हुए, मुझे http://example.com/favicon.ico और साथ ही http://cdn.example.com/js/ga.js के लिए "200 (कैश)" प्राप्त होता है

लेकिन, मुझे http://cdn.example.com/js/combined.min.js के लिए http स्थिति "304" प्राप्त है

मुझे समझ में नहीं आता है कि मेरे पास एक ही निर्देशिका / js / में स्थित दो जावास्क्रिप्ट फाइलें क्यों हैं, एक http स्थिति 304 और दूसरा 200 (कैश) स्थिति कोड लौटा रहा है।

जवाबों:


220

कोड "200 (कैश)" वाले आइटम सीधे आपके ब्राउज़र कैश से पूरे हो गए थे, जिसका अर्थ है कि आइटम के मूल अनुरोधों को हेडर के साथ लौटाया गया था, यह दर्शाता है कि ब्राउज़र उन्हें कैश कर सकता है (जैसे भविष्य-दिनांक ExpiresयाCache-Control: max-age हेडर), और वह भी जब आप नए अनुरोध को ट्रिगर करते हैं, तो उन कैश्ड ऑब्जेक्ट को अभी भी स्थानीय कैश में संग्रहीत किया गया था और अभी तक समाप्त नहीं हुआ है।

दूसरी ओर, 304, ब्राउज़र की जाँच के बाद सर्वर की प्रतिक्रिया है कि क्या किसी फ़ाइल को अंतिम संस्करण के बाद से संशोधित किया गया था, जो कैश किया गया था (उत्तर "नहीं")।

सबसे इष्टतम वेब प्रदर्शन के लिए, आप सभी परिसंपत्तियों के लिए एक दूर-भविष्य Expires:या Cache-Control: max-ageहेडर की स्थापना कर रहे हैं , और फिर जब किसी परिसंपत्ति को बदलना होगा, तो संपत्ति का वास्तविक फ़ाइल नाम बदलना या उस संपत्ति के अनुरोधों के लिए एक संस्करण स्ट्रिंग जोड़ना। यह तब तक किए जाने वाले किसी भी अनुरोध की आवश्यकता को समाप्त करता है जब तक कि परिसंपत्ति निश्चित रूप से कैश में संस्करण से नहीं बदल जाती है (उस 304 प्रतिक्रिया की आवश्यकता नहीं है)। Google के पास दीर्घकालिक कैशिंग के सही उपयोग पर अधिक विवरण हैं


2
तो गति के नजरिए से बेहतर क्या है ... "200 (कैश)" या "304" http स्थिति संदेश?
हांक

22
200 कैश। इस बारे में यहाँ कुछ अच्छी नोट: developer.yahoo.com/performance/rules.html#expires । आप अपनी संपत्तियों पर यथासंभव समय समाप्ति समय चाहते हैं, लेकिन इस तथ्य के साथ इसे संतुलित करना होगा कि आप इस तरह एक निश्चित मात्रा में नियंत्रण खो देते हैं। एक चीज जो आप कर सकते हैं वह है फाइलों पर लंबे समय तक चलने वाले एक्सपिरिएंस को सेट करना, और फिर जब जरूरत हो तो उन फाइल्स के लिए एसेट वर्जन नंबर बढ़ाना। उदाहरण के लिए आप style.css? V1 को शामिल कर सकते हैं और <link> तत्व में style.css? V2 में वृद्धि होने पर परिवर्तन कर सकते हैं।
बेन रिजेन्स्पैन

1
न्यायमूर्ति, तो क्यों फायरबग रिपोर्ट है कि Ga.js के लिए स्थानीय कैश (स्थिति = 200 कैश) से खींचा जाता है, जबकि संयुक्त .min.js 304 http स्थिति की रिपोर्ट कर रहा है। क्या अजीब बात है कि दोनों फाइलें एक ही फाइल प्रकार (जावास्क्रिप्ट) की हैं और एक ही सर्वर डायरेक्टरी में रहती हैं। आपको लगता है कि दोनों या तो 200 या 304 होंगे, और अलग नहीं होंगे
हांक

8
max-ageऔर ageसंयुक्त भी में 200 (कैश) परिणाम परिणाम कर सकते हैं, तो हेडर ageसे भी कम है max-age। एक अपवाद तब होता है जब उपयोगकर्ता ब्राउज़र ताज़ा बटन पर क्लिक करता है, जिस स्थिति में 304 हेडर भेजा जाता है।
yitwail

2
एचटीएमएल 5 बॉयलरप्लेट कैश-पर्दाफाश की क्वेरी स्ट्रिंग विधि का उपयोग कर के खिलाफ सिफारिश की गई है - इसे बदलने के लिए बेहतर है href, url,और srcप्रत्येक फ़ाइल के लिए संदर्भ के लिए एक 'फिंगरप्रिंट' (या तो फ़ाइल का हैश या एक साधारण वृद्धि संख्या) शामिल हैं, और उसके बाद सर्वर बताने के लिए उस फ़िंगरप्रिंट को बंद करने के लिए और बस style.cssया जो भी हो। यदि आप सर्वर पर ऐसा नहीं कर सकते हैं, तो अपने बिल्ड सिस्टम को फिंगरप्रिंट के साथ वास्तविक फ़ाइलों का नाम बदलें।
आयनो

62

200 (कैश) का अर्थ है कि फ़ायरफ़ॉक्स बस स्थानीय रूप से कैश्ड संस्करण का उपयोग कर रहा है। यह सबसे तेज़ है क्योंकि वेब सर्वर से कोई अनुरोध नहीं किया जाता है।

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

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


18

इसने मुझे लंबे समय तक फेंक दिया। पहली बात मैं सत्यापित करूँगा कि आप ताज़ा बटन पर क्लिक करके पृष्ठ को पुनः लोड नहीं कर रहे हैं, जो हमेशा संसाधनों के लिए एक सशर्त अनुरोध जारी करेगा और पृष्ठ के कई तत्वों के लिए 304s लौटाएगा। इसके बजाय url बार पर जाएँ पृष्ठ का चयन करें और दर्ज करें जैसे कि आपने उसी URL में फिर से टाइप किया था, जो आपको ठीक से कैश्ड होने का बेहतर संकेतक देगा। यह लेख सशर्त और बिना शर्त अनुरोधों के बीच अंतर को समझाता है और ताज़ा बटन उन्हें कैसे प्रभावित करता है: http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about- सशर्त-http-अनुरोधों और ताज़ा-button.aspx


1
मैं यह भी नहीं बता सकता कि सीडीएन के अनुरोधों की 304 स्थिति जानने के लिए मैंने कितना समय बिताया। यद्यपि आप थोड़ा अलग प्रश्न का उत्तर देते हैं, लेकिन आप
Peeech

आप सही हैं: कोड में अंतर इस तथ्य से संबंधित है कि आप उसी पृष्ठ को पुनः लोड कर रहे हैं या नहीं। यदि मैं किसी पृष्ठ को पुनः लोड करता हूं, तो मैं ब्राउज़र के नेटवर्क मॉनिटर में 304 कोड देखता हूं। लेकिन, अगर मैं किसी अन्य URL का उपयोग करता हूं, जो इन समान फ़ाइलों का उपयोग करता है, तो मैं ब्राउज़र के नेटवर्क मॉनिटर को 200 (कैश से) कोड में देखता हूं। मेरे मामले में, अन्य URL मूल URL (पृष्ठ था) में सिर्फ एक क्वेरी स्ट्रिंग जोड़ा गया था अनिवार्य रूप से वही)।
aldemarcalazans

8

HTTP 304 "संशोधित नहीं है"। आपका वेब सर्वर मूल रूप से ब्राउज़र को बता रहा है "पिछली बार जब आपने यह अनुरोध किया था तब से यह फ़ाइल नहीं बदली है।" जबकि एक HTTP 200 ब्राउज़र को बता रहा है "यहाँ एक सफल प्रतिक्रिया है" - जिसे तब लौटाया जाना चाहिए जब या तो पहली बार आपका ब्राउज़र फ़ाइल तक पहुंच रहा हो या पहली बार एक संशोधित प्रतिलिपि एक्सेस की जा रही हो।

स्टेटस कोड के बारे में अधिक जानकारी के लिए http://en.wikipedia.org/wiki/List_of_HTTP_status_ododes देखें


यही मेरी समझ भी है ... यही कारण है कि मैंने अपने मूल पोस्ट में कहा है कि मैंने अपने पृष्ठ को कई बार ताज़ा किया है और अभी भी उसी favicon.ico के लिए "200 (कैश)" प्राप्त कर रहा हूं और विशेष रूप से जावास्क्रिप्ट में मैं भी शामिल हूं। बहुत अजीब
हांक

2
200 वास्तव में कैश्ड का मतलब नहीं है, यह सिर्फ ओके का मतलब है। संभावना है कि आपका सर्वर कॉन्फ़िगरेशन स्पष्ट रूप से ब्राउज़र को आपकी ico और js फ़ाइलों को कैश करने के लिए नहीं कहता है, जो इसे 200 का स्टेटस कोड लौटा देगा।
रिचलेलैंड

यह मेरे कुछ जावास्क्रिप्ट पर b / c का मामला नहीं है, मैं एक 304 प्राप्त करता हूं और अन्य जावास्क्रिप्ट मुझे "200 (कैश)" मिलता है। सभी जावास्क्रिप्ट एक ही वेब सर्वर निर्देशिका example.com/js/
Hank

मुझे उस 200 (कैश) को जोड़ना चाहिए इसका मतलब है कि यह स्थानीय रूप से कैश किया गया है और वास्तव में सर्वर से अनुरोध नहीं कर रहा है, जो सर्वर पर जाने और 304 प्रतिक्रिया प्राप्त करने की तुलना में तेज़ होने जा रहा है।
रिचलेलैंड

मैंने अपनी लाइव साइट और जावास्क्रिप्ट को दिखाने के लिए अपनी मूल पोस्ट को अपडेट किया है। कृपया मेरी अद्यतन मूल पोस्ट देखें।
हांक

2

आपके आखिरी सवाल के लिए, क्यों? मैं जो जानता हूं, उसके साथ समझाने की कोशिश करूंगा

आम आदमी की शर्तों में उन तीन स्थिति कोडों का संक्षिप्त विवरण।

  • 200 - सफलता (ब्राउज़र अनुरोध और सर्वर से फ़ाइल प्राप्त करें)

यदि कैशिंग सर्वर में सक्षम है

  • 200 (मेमोरी कैश से) - फ़ाइल ब्राउज़र में मिली, इसलिए ब्राउज़र सर्वर से अनुरोध नहीं कर रहा है
  • 304 - ब्राउज़र एक फ़ाइल का अनुरोध करता है लेकिन इसे सर्वर द्वारा अस्वीकार कर दिया जाता है

कुछ फ़ाइलों के लिए ब्राउज़र सर्वर से अनुरोध करने का निर्णय ले रहा है और कुछ के लिए यह संग्रहीत (कैश्ड) फाइलों से पढ़ना तय कर रहा है। ऐसा क्यों है ? हर फाइल की एक्सपायरी डेट होती है, इसलिए

यदि कोई फ़ाइल समाप्त नहीं हुई है तो ब्राउज़र कैश (200 कैश) से उपयोग करेगा।

यदि फ़ाइल समाप्त हो गई है, तो ब्राउज़र एक फ़ाइल के लिए सर्वर का अनुरोध करता है। सर्वर दोनों स्थानों (ब्राउज़र और सर्वर) में फ़ाइल की जाँच करें। यदि समान फ़ाइल मिली, तो सर्वर अनुरोध को अस्वीकार कर देता है। प्रोटोकॉल के अनुसार ब्राउज़र मौजूदा फ़ाइल का उपयोग करता है।

इस nginx कॉन्फ़िगरेशन को देखें

location / {
    add_header Cache-Control must-revalidate;
    expires     60;
    etag on;

    ...
}

यहां समाप्ति 60 सेकंड के लिए सेट है, इसलिए सभी स्थिर फ़ाइलों को 60 सेकंड के लिए कैश किया गया है। इसलिए यदि आप 60 सेकंड के भीतर फिर से फ़ाइल का अनुरोध करते हैं तो ब्राउज़र मेमोरी (200 मेमोरी) से पढ़ेगा। यदि 60 सेकंड के बाद यू अनुरोध सर्वर (304) का अनुरोध करेगा।

मैंने मान लिया कि फ़ाइल 60 सेकंड के बाद नहीं बदली जाती है, उस स्थिति में आपको 200 मिलेगा (यानी, अपडेट की गई फ़ाइल सर्वर से प्राप्त होगी)।

इसलिए, यदि सर्वरों को अलग-अलग एक्सपायरिंग और कैशिंग हेडर (नीतियों) के साथ कॉन्फ़िगर किया गया है, तो स्थिति भिन्न हो सकती है।

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


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