कैश-कंट्रोल क्या है: निजी?


148

जब मैं chesseng.herokuapp.com पर जाता हूं तो मुझे एक प्रतिक्रिया हैडर मिलता है जो दिखता है

Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/css
Date:Tue, 16 Oct 2012 06:37:53 GMT
Last-Modified:Tue, 16 Oct 2012 03:13:38 GMT
Status:200 OK
transfer-encoding:chunked
Vary:Accept-Encoding
X-Rack-Cache:miss

और फिर मैं पृष्ठ को ताज़ा करता हूं और प्राप्त करता हूं

Cache-Control:private
Connection:keep-alive
Date:Tue, 16 Oct 2012 06:20:49 GMT
Status:304 Not Modified
X-Rack-Cache:miss

तो ऐसा लगता है जैसे कैशिंग काम कर रहा है। अगर वह कैशिंग के लिए काम करता है तो एक्सपायर्स और कैश-कंट्रोल का क्या मतलब है : अधिकतम आयु । भ्रम में जोड़ने के लिए, जब मैं https://developers.google.com/speed/pagespeed/insights/ पर पृष्ठ का परीक्षण करता हूं, तो यह मुझे "लीवरेज ब्राउज़र कैशिंग" बताता है।


इस चित्र को देखें stackoverflow.com/a/49925190/3748498
pravdomil

जवाबों:


74

कैशिंग क्यों काम कर रहा है, इसके बारे में आपके सवाल का जवाब देने के लिए, भले ही वेब-सर्वर ने हेडर शामिल नहीं किया हो:

  • समय समाप्ति: [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इसलिए है क्योंकि यह फाइलों के अलावा उन चीजों के लिए काम करता है , या जिन चीजों में तारीख की धारणा है । यह बस है


1
बहुत बढ़िया! मैंने इस जवाब के लिए एक इनाम रखा। अगर cache-controlअस्तित्व में नहीं है तो क्या होगा ? और आपके पास केवल Etag है? क्या अभी भी सर्वर के खिलाफ 'सशर्त अनुरोध' करने की जरूरत नहीं है? जब मैं ऑफ़लाइन होता हूं तो व्यवहार यह होता है कि यह कैश से वापस आता है। लेकिन जब यह ऑफ़लाइन होता है तो यह सशर्त अनुरोध नहीं कर सकता है। तो क्या इसका मतलब है कि अगर आप ऑफ़लाइन रहेंगे तो यह अनिश्चित काल तक कैश होगा? मैंने इस प्रश्न को पहले ही यहाँ विस्तार से पूछा है । क्या आप देख सकते हैं?
हनी

167
Cache-Control: private

इंगित करता है कि सभी या प्रतिक्रिया संदेश का हिस्सा एक एकल उपयोगकर्ता के लिए अभिप्रेत है और एक साझा कैश द्वारा छद्म सर्वर जैसे कैश नहीं किया जाना चाहिए।

से RFC2616 खंड 14.9.1


14
क्योंकि यह आपके ब्राउज़र द्वारा कैश किया गया था। आप एकल उपयोगकर्ता हैं जिनके लिए प्रतिक्रिया का इरादा था।
दान डी।

13
नहीं, ऐसा नहीं है क्योंकि Cache-Control:privateकेवल यह बताता है कि साझा किए गए कैश (जैसे प्रॉक्सी कैश) को प्रतिक्रिया को कैश नहीं करना चाहिए।
दान डी।

5
@Trejkaz नहीं, यह वास्तव में एक उपयोगकर्ता का मतलब है। एक उपयोगकर्ता एक खाता है जिसकी अपनी गृह निर्देशिका होती है जिसमें कैश रहता है। वे प्रोफ़ाइल जो उसी उपयोगकर्ता के स्वामित्व में हैं वे अपना कैश साझा कर सकते हैं। जैसा आपने पाया है। लेकिन एक ही कंप्यूटर पर दो प्रोफाइल अगर अलग-अलग उपयोगकर्ताओं के स्वामित्व में हैं तो उन्हें अपना कैश साझा नहीं करना चाहिए, जब तक कि कैश को साझा कैश के रूप में नहीं माना जाता है।
दान डी।

2
आह, इसलिए यह प्रति-उपयोगकर्ता-पर-ओएस-स्तर है। हाँ, मैं जो सोच रहा हूं, वह क्रोम की गुप्त खिड़कियों और गैर-गुप्त लोगों के बीच एक स्पष्ट सूचना रिसाव के कारण है, जो इसे करने के लिए कैश का उपयोग करता है।
ट्रेकजाज़

2
@ डिडिबस की proxy-revalidateआवश्यकता है कि परदे के पीछे प्रत्येक पहुंच पर हमेशा अमान्य हो । जहां privateप्रॉक्सी को कैशिंग से रोकता है।
दान डी।

20

RFC 2616, धारा 14.9.1 :

इंगित करता है कि प्रतिक्रिया संदेश के सभी या भाग एक ही उपयोगकर्ता के लिए अभिप्रेत है और एक साझा कैश द्वारा कैश नहीं किया जाना चाहिए ... एक निजी (गैर-साझा) कैश एमएवाई प्रतिक्रिया को कैश करता है।


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

मेरे लिए, एक और अधिक ठोस उदाहरण के Cache-Control: privateकि प्रॉक्सी सर्वर (जो आमतौर पर कई उपयोगकर्ता हो) यह कैश नहीं होगा। यह अंत उपयोगकर्ता के लिए है, और कोई नहीं।


FYI करें, RFC स्पष्ट करता है कि यह सुरक्षा प्रदान नहीं करता है। यह सही सामग्री दिखाने के बारे में है, सामग्री सुरक्षित नहीं है।

निजी शब्द का यह उपयोग केवल नियंत्रित करता है जहां प्रतिक्रिया को कैश किया जा सकता है, और संदेश सामग्री की गोपनीयता सुनिश्चित नहीं कर सकता है।


5
एक निजी (गैर-साझा) कैश MAY कैश को प्रतिसाद देता है। यह हिस्सा महत्वपूर्ण है। धन्यवाद।
ओलिवर

0

एक्सपायर इकाई-हेडर फ़ील्ड दिनांक / समय देता है जिसके बाद प्रतिक्रिया को बासी माना जाता है। कैश-कंट्रोल: अधिकतम फ़ील्ड आयु मान (सेकंड में) देता है, जिससे प्रतिक्रिया बासी माना जाता है।

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

इस समस्या को हल करने के लिए, HTTP1.1 अंतिम-संशोधित सिर देता है। सर्वर क्लाइंट को प्रतिक्रिया की अंतिम संशोधित तारीख देता है। जब क्लाइंट को इस संसाधन की आवश्यकता होती है, तो यह If-Modified-चूंकि हेड फ़ील्ड को सर्वर पर भेज देगा। यदि यह तिथि रिज़ॉउशन की संशोधित तिथि से पहले है, तो सर्वर रिसोर्स को क्लाइंट को भेजेगा और 200 कोड देगा। अन्य रूप से, यह क्लाइंट को 304 कोड लौटाएगा और इसका मतलब है कि क्लाइंट इसे कैश किए गए संसाधन का उपयोग कर सकता है।

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