प्रज्ञा और कैश-कंट्रोल हेडर के बीच अंतर?


166

मैं विकिपीडिया पर प्राग्मा हेडर के बारे में पढ़ता हूँ जो कहता है:

"द प्रग्मा: नो-कैश हेडर फ़ील्ड एक HTTP / 1.0 हेडर है जो अनुरोधों में उपयोग के लिए है। यह ब्राउज़र के लिए सर्वर और किसी भी मध्यवर्ती कैश को बताने के लिए एक साधन है जो यह संसाधन का एक नया संस्करण चाहता है, सर्वर के लिए नहीं। ब्राउज़र को संसाधन को कैश नहीं करने के लिए बताने के लिए। कुछ उपयोगकर्ता एजेंट प्रतिक्रिया में इस हेडर पर ध्यान देते हैं, लेकिन HTTP / 1.1 RFC विशेष रूप से इस व्यवहार पर भरोसा करने के खिलाफ चेतावनी देता है। "

लेकिन मुझे समझ नहीं आया कि यह क्या करता है? Cache-Controlहेडर किसका मूल्य है no-cacheऔर Pragmaकिसका मूल्य है, के बीच क्या अंतर है no-cache?

जवाबों:


196

PragmaHTTP / 1.0 कार्यान्वयन है और cache-controlउसी अवधारणा का HTTP / 1.1 कार्यान्वयन है। वे दोनों ग्राहक को प्रतिक्रिया को रोकने से रोकने के लिए हैं। पुराने क्लाइंट HTTP / 1.1 का समर्थन नहीं कर सकते हैं, यही वजह है कि हेडर अभी भी उपयोग में है।


31
हालांकि नीचे cnst का उत्तर अधिक जटिल है, यह विनिर्देश के अनुसार बहुत अधिक सही है। Pragma: no-cacheकेवल अनुरोधों में उपयोग किए जाने का इरादा है (जिसका अर्थ है "मुझे मूल चाहिए, कैश्ड कॉपी नहीं") और इसका व्यवहार प्रतिक्रियाओं के लिए निर्दिष्ट नहीं है।
क्लेम

5
Cache-Control: no-cacheअनुरोधों के लिए समान अर्थ है, लेकिन वास्तव में प्रतिक्रियाओं के लिए भी परिभाषित किया गया है, जिसका अर्थ है "यदि आप भविष्य में इस की एक कैश्ड प्रतिलिपि का उपयोग करना चाहते हैं, तो आपको पहले मेरे साथ जांचना होगा कि यह अप-टू-डेट है (अर्थात पुनर्मूल्यांकन करें)"।
क्लेमे

3
यह कैश कंट्रोल के लिए है, इसे केवल कैशे-रोकथाम के लिए नहीं करना है, इसका उपयोग यह कहने के लिए भी किया जा सकता है कि "आप इसे कैश कर सकते हैं।" ....
jave.web

मूल उत्तर। इसे और अधिक जटिल बनाने के लिए: यह एक अनुरोध शीर्षलेख है जिसका अर्थ है कि आप सर्वर को भी नो-कैश भेज सकते हैं। और यह वास्तव में ग्राहकों को बासी सामग्री वापस करने का क्या मतलब हो सकता है, क्या? अब आप इसे भूल
जाइए

वे दोनों क्लाइंट को प्रतिक्रिया को रोकने के लिए हैं, जो पाठकों के लिए एक भ्रमित करने वाला नोट है। यह भी हो सकता है max-ageजो कैशिंग को नहीं रोकता है। यह सिर्फ इसके लिए एक समाप्ति तिथि निर्धारित करता है ...
हनी

97

इसमें कोई अंतर नहीं है, सिवाय इसके कि Pragmaकेवल क्लाइंट द्वारा अनुरोधों पर लागू होने के रूप में परिभाषित किया गया है, जबकि क्लाइंट Cache-Controlके अनुरोधों और सर्वरों के जवाब दोनों द्वारा उपयोग किया जा सकता है।

इसलिए, जहां तक ​​मानक जाते हैं, उनकी तुलना केवल अनुरोध करने वाले ग्राहक के दृष्टिकोण से की जा सकती है और क्लाइंट से अनुरोध प्राप्त करने वाले सर्वर की। Http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 परिभाषित करता है परिदृश्य के रूप में इस प्रकार है:

HTTP / 1.1 कैश SHOULD "प्राग्मा: नो-कैश" का इलाज करता है जैसे कि क्लाइंट ने "कैश-कंट्रोल: नो-कैश" भेजा था। HTTP में कोई भी नया प्रज्ञा निर्देश परिभाषित नहीं किया जाएगा।

  Note: because the meaning of "Pragma: no-cache as a response
  header field is not actually specified, it does not provide a
  reliable replacement for "Cache-Control: no-cache" in a response

जिस तरह से मैं ऊपर पढ़ूंगा:

  • यदि आप एक ग्राहक और जरूरत लिख रहे हैं no-cache:

    • केवल Pragma: no-cacheआपके अनुरोधों में उपयोग करें, क्योंकि आप नहीं जानते कि क्या Cache-Controlसर्वर द्वारा समर्थित है;
    • लेकिन जवाब में, यह तय करने के लिए कि क्या कैश करना है, जांच करें Cache-Control
  • यदि आप एक सर्वर लिख रहे हैं:

    • ग्राहकों से अनुरोधों की जांच के लिए Cache-Control; यदि नहीं मिला है, तो तर्क की जांच करें Pragma: no-cacheऔर निष्पादित करें Cache-Control: no-cache;
    • उत्तर में, प्रदान करें Cache-Control

बेशक, वास्तविकता RFC में लिखे या निहित होने से अलग हो सकती है!


5
क्या होगा अगर हेडर दोनों के पास है? Cache-Control: max-age=86400और Pragma: no-cache? फिर आधुनिक ब्राउज़रों में से किसे सम्मानित किया जाएगा?
पीके हंटर

3
@PKHunter, यदि व्यवहार अपरिभाषित है तो आप इसकी देखभाल क्यों करेंगे? यदि आप सर्वर के लिए जिम्मेदार हैं, तो स्पष्ट रूप से आप ग्राहक को भ्रामक जानकारी देने से बेहतर कर सकते हैं। इसके अलावा, जैसा कि मेरे उत्तर में कहा गया Pragma: no-cacheहै, केवल ब्राउज़र से अनुरोधों के लिए परिभाषित किया गया है, और यह इस प्रकार सर्वर से ब्राउज़र के उत्तर में पूरी तरह से अमान्य और अपरिभाषित होगा, उदाहरण के लिए, मैं कल्पना करूँगा कि हर एक ब्राउज़र (चाहे आधुनिक हो या नहीं) किसी भी उत्तर में इस तरह के हेडर को अनदेखा करना चाहिए जो इसे प्राप्त हो सकता है।
20st17

3
एक आधुनिक ब्राउज़र को कैश-कंट्रोल के पक्ष में प्राग्मा को अनदेखा करना चाहिए यदि दोनों मौजूद हैं क्योंकि उत्तरार्द्ध समय अवधि और अन्य जानकारी निर्दिष्ट कर सकता है जो प्रारंभिक 1.0 प्रोटोकॉल में उपलब्ध नहीं था।
रान्डेल बॉर्क

17
| Stop using          | Replaced with                    |
| (HTTP 1.0)          | (HTTP 1.1 - 1999)                |
|---------------------|----------------------------------|
| Expires: [date]     | Cache-Control: max-age=[seconds] |
| Pragma: no-cache    | Cache-Control: no-cache          |

यदि यह 1999 के बाद है, और आप अभी भी उपयोग कर रहे हैं समय-सीमा समाप्त या Pragma , आप इसे गलत कर रहे हैं।

मैं तुम्हें देख रहा हूँ Stackoverflow:

200 OK
Pragma: no-cache
Content-Type: application/json
X-Frame-Options: SAMEORIGIN
X-Request-Guid: a3433194-4a03-4206-91ea-6a40f9bfd824
Strict-Transport-Security: max-age=15552000
Content-Length: 54
Accept-Ranges: bytes
Date: Tue, 03 Apr 2018 19:03:12 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-yyz8333-YYZ
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1522782193.766958,VS0,VE30
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Cache-Control: private

tl; dr: PragmaHTTP / 1.0 की विरासत है और इंटरनेट एक्सप्लोरर 5, या नेटस्केप 4.7 के बाद से इसकी आवश्यकता नहीं है। जब तक आप अपने कुछ उपयोगकर्ताओं को IE5 का उपयोग करने की उम्मीद नहीं करते हैं: इसका उपयोग करना बंद करना सुरक्षित है।


  • अवसान: [date] (पदावनत - HTTP 1.0)
  • प्रगति: नो-कैश (पदावनत - HTTP 1.0)
  • कैश-कंट्रोल: अधिकतम आयु =[seconds]
  • कैश-कंट्रोल: नो-कैश (हर बार कैश्ड कॉपी को पुनः सत्यापित करना होगा)

और सशर्त अनुरोध:

  • Etag (इकाई टैग) आधारित सशर्त अनुरोध
    • सर्वर: Etag: W/“1d2e7–1648e509289”
    • ग्राहक: If-None-Match: W/“1d2e7–1648e509289”
    • सर्वर: 304 Not Modified
  • संशोधित तिथि आधारित सशर्त अनुरोध
    • सर्वर: last-modified: Thu, 09 May 2019 19:15:47 GMT
    • ग्राहक: If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • सर्वर: 304 Not Modified

अंतिम संशोधन: Thu, 09 मई 2019 19:15:47 GMT


2
RFC का कहना है कि अगर ग्राहक कैश-कंट्रोल का समर्थन नहीं करता है तो आपको उन दोनों का उपयोग करना चाहिए: tools.ietf.org/html/rfc7234#page-29
Randall Borck

3
ग्राहक "चाहिए करने के लिए" दोनों शामिल हैं - जब तक कि उसका HTTP / 1.1 और HTTP / 1.0 कैचिंग सर्वर अलग ढंग से इलाज करने के लिए चाहता है। सर्वर में शामिल नहीं होना चाहिएPragma(HTTP / 1.0 में, प्राग्मा को प्राप्तकर्ताओं के लिए कार्यान्वयन-निर्दिष्ट निर्देशों के लिए एक एक्स्टेंसिबल फ़ील्ड के रूप में परिभाषित किया गया था। यह विनिर्देश अंतर-विस्तार को बेहतर बनाने के लिए इस तरह के एक्सटेंशन को चित्रित करता है।)
इयान बॉयड

2
सुरक्षा दृष्टिकोण से, इसका उपयोग करने की सिफारिश की जाती है। कई ब्राउज़र प्रज्ञा का अनुसरण करते हैं: नो-कैश निर्देश, इसलिए इसे OWASP द्वारा उपयोग करने की सलाह दी जाती है: owasp.org/index.php/…
Randall Borck

2
@ रैंडल बॉर्क: आप पुरानी (दो दशकों से, कोई कम नहीं!) जानकारी फैला रहे हैं। कोई भी ब्राउज़र प्रज्ञा निर्देश का पालन नहीं करता है, जब तक कि यह 1999 का नहीं है। यह कार्गो पंथ सलाह है: "यह चोट नहीं करता है और हमने इसे हमेशा किया है, इसलिए यह अच्छा और आवश्यक है।"
पिस्कोर ने बिल्डिंग

2
@Piskvor अधिकांश सर्वर अभी भी 1.0 और 1.1 दोनों का समर्थन करते हैं, इसलिए जब तक आप HTTP / 1.0 अनुरोधों को सक्रिय रूप से ब्लॉक नहीं करते हैं, तब तक आप यह नहीं चुनते हैं कि क्लाइंट किस प्रोटोकॉल का उपयोग कर रहा है। अधिकांश डेवलपर्स आज 1.0 को ब्लॉक करने की जहमत नहीं उठाते हैं, इसलिए यह 2019 में भी अभी भी सबसे अच्छा अभ्यास है।
रान्डेल बोरक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.