कैशिंग क्यों काम कर रहा है, इसके बारे में आपके सवाल का जवाब देने के लिए, भले ही वेब-सर्वर ने हेडर शामिल नहीं किया हो:
- समय समाप्ति:
[a date]
- कैश-कंट्रोल: अधिकतम आयु =
[seconds]
सर्वर ने कृपया किसी भी मध्यवर्ती प्रॉक्सी को सामग्री को कैश न करने के लिए कहा (यानी आइटम को केवल निजी कैश में कैश किया जाना चाहिए , अर्थात केवल आपके स्थानीय मशीन पर):
लेकिन सर्वर किसी भी तरह के कैशिंग संकेत को शामिल करना भूल गया:
- वे शामिल करना भूल जाते समय-सीमा समाप्त , तो ब्राउज़र उस तिथि तक कैश की गई प्रतिलिपि का उपयोग करने जानता है
- वे मैक्स-एज को शामिल करना भूल गए , इसलिए ब्राउज़र जानता है कि कैश्ड आइटम कितने समय के लिए अच्छा है
- वे ई-टैग को शामिल करना भूल गए , इसलिए ब्राउज़र एक सशर्त अनुरोध कर सकता है
लेकिन उन्होंने प्रतिक्रिया में अंतिम-संशोधित तिथि शामिल की:
Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT
क्योंकि ब्राउज़र को पता है कि फ़ाइल को संशोधित करने की तिथि थी, यह एक सशर्त अनुरोध कर सकता है । यह फ़ाइल के लिए सर्वर से पूछेगा, लेकिन सर्वर को निर्देश दें कि यदि वह 2012/10/16 3:27:27 से संशोधित किया गया है तो केवल फ़ाइल भेजें।
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
सर्वर अनुरोध प्राप्त करता है, महसूस करता है कि ग्राहक के पास पहले से ही सबसे हाल का संस्करण है। क्लाइंट को भेजने के 200 OKबजाय, पेज की सामग्री के बाद, इसके बजाय यह बताता है कि आपका कैश्ड संस्करण अच्छा है:
304 Not Modified
आपके ब्राउज़र को सर्वर को एक अनुरोध भेजने में देरी का सामना करना पड़ा, और एक प्रतिक्रिया की प्रतीक्षा करें, लेकिन इसने स्थिर सामग्री को फिर से डाउनलोड करने से बचा लिया।
मैक्स-एज क्यों ? क्यों समाप्त हो रहा है ?
क्योंकि लास्ट-मॉडिफाइड चूसता है।
सर्वर पर सब कुछ नहीं है इसके साथ जुड़े एक तारीख। यदि मैं मक्खी पर एक पृष्ठ बना रहा हूं, तो इसके साथ कोई तिथि जुड़ी नहीं है - यह अब है । लेकिन मैं उपयोगकर्ता को 15 सेकंड के लिए मुखपृष्ठ को कैश करने देने के लिए पूरी तरह से तैयार हूं:
200 OK
Cache-Control: max-age=15
यदि उपयोगकर्ता हथौड़ों F5, वे 15 सेकंड के लिए कैश्ड संस्करण प्राप्त करते रहेंगे। यदि यह एक कॉर्पोरेट प्रॉक्सी है, तो सभी 67198 उपयोगकर्ता एक ही पृष्ठ को एक ही 15-सेकंड विंडो में मारते हैं, सभी को समान सामग्री मिलेगी - सभी करीबी कैश से सेवा की जाती हैं। सभी के लिए प्रदर्शन की जीत।
जोड़ने Cache-Control: max-ageका गुण यह है कि ब्राउज़र को सशर्त अनुरोध भी नहीं करना पड़ता है ।
- यदि आपने केवल निर्दिष्ट
Last-Modifiedकिया है, तो ब्राउज़र को एक अनुरोध करना होगा If-Modified-Since, और 304 Not Modifiedप्रतिक्रिया के लिए देखना होगा
- यदि आप निर्दिष्ट करते हैं
max-age, तो ब्राउज़र को नेटवर्क राउंड-ट्रिप को भी भुगतना नहीं पड़ेगा; सामग्री ठीक कैश से बाहर आ जाएगी
"कैश-कंट्रोल: अधिकतम आयु" और "एक्सपायर" के बीच का अंतर
Expiresआधुनिक (सी। 1998) Cache-Control: max-ageहेडर के बराबर एक विरासत है :
Expires: आप एक तारीख निर्दिष्ट करें (yuck)
max-age: आप सेकंड (अच्छाई) निर्दिष्ट करते हैं
और यदि दोनों निर्दिष्ट हैं, तो ब्राउज़र उपयोग करता है max-age:
200 OK
Cache-Control: max-age=60
Expires: 20180403T192837
1998 के बाद लिखी गई किसी भी वेब-साइट का Expiresअब और उपयोग नहीं होना चाहिए max-age।
ETag क्या है?
ETag , लास्ट-मॉडिफाइड के समान है , सिवाय इसके कि इसमें कोई तारीख नहीं होनी चाहिए - यह सिर्फ कुछ होना है ।
अगर मैं किसी डेटाबेस से उत्पादों की सूची खींच रहा हूं, तो सर्वर अंतिम rowversionतिथि के बजाय ETag के रूप में भेज सकता है :
200 OK
ETag: "247986"
मेरा ETag एक स्थिर संसाधन (जैसे छवि, js, css, फ़ॉन्ट) या कैश्ड रेंडर किए गए पृष्ठ का SHA1 हैश हो सकता है (यानी मोज़िला MDN विकी यही करता है; वे अंतिम मार्कअप है:
200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
और अंतिम-संशोधित के आधार पर सशर्त अनुरोध के मामले में बिल्कुल :
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
304 Not Modified
मैं ETag के आधार पर एक सशर्त अनुरोध कर सकता हूं:
GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
304 Not Modified
एक ETagबेहतर Last-Modifiedइसलिए है क्योंकि यह फाइलों के अलावा उन चीजों के लिए काम करता है , या जिन चीजों में तारीख की धारणा है । यह बस है