"वैरी: एक्सेप्ट" HTTP हेडर का क्या कार्य है?


93

मैं गतिशील वेब पेज उत्पन्न करने के लिए PHP का उपयोग करता हूं। जैसा कि निम्नलिखित ट्यूटोरियल पर कहा गया है (नीचे लिंक देखें), जब $ _SERVER ['HTTP_ACCEPT'] को अनुमति देता है, तो MHTML प्रकार के XHTML दस्तावेज़ों का MIME प्रकार "अनुप्रयोग / xHTML + xml" होना चाहिए। चूंकि आप एक ही पेज को 2 अलग-अलग MIME ("एप्लिकेशन / xHTML + xml" और "टेक्स्ट / html") के साथ परोस सकते हैं, इसलिए आपको "स्वीकार" करने के लिए "वैरी" HTTP हेडर सेट करना चाहिए। इससे प्रॉक्सी पर कैश की मदद मिलेगी।

लिंक: http://keystonewebooks.com/articles/mime_type.php

अब मुझे इसके निहितार्थ पर यकीन नहीं है: हेडर ('वैरी: एक्सेप्ट'); मुझे वास्तव में यकीन नहीं है कि 'वैरी: एक्सेप्ट' ठीक क्या करेगी ...

केवल व्याख्या मुझे मिली है:

कंटेंट-टाइप हेडर के बाद, एक वैरी हेडर भेजा जाता है (यदि मैं इसे सही तरीके से समझता हूं) प्रॉक्सी सर्वर की तरह इंटरमीडिएट कैश बताता है, कि डॉक्यूमेंट का कंटेंट टाइप क्लाइंट की क्षमताओं के आधार पर भिन्न होता है जो दस्तावेज़ का अनुरोध करता है। http://www.456bereastreet.com/archive/200408/content_negotiation/

कोई भी मुझे इस शीर्ष लेख का "वास्तविक" स्पष्टीकरण दे सकता है ( उस मूल्य के साथ )। मुझे लगता है कि मैं चीजों को समझता हूं जैसे: वैरी: स्वीकार-एनकोडिंग जहां प्रॉक्सी पर कैश परोसा गया पृष्ठ के एन्कोडिंग पर आधारित हो सकता है, लेकिन मुझे समझ में नहीं आता है: वैरी: स्वीकार


1
स्पष्ट रूप से - परेशान मत करो। उस साइट पर कार्यान्वयन में खामियों को छोड़कर, XML सामग्री-प्रकार के साथ सेवा करने से आपको लाभ मिलने वाला है जब आप ऐसी चीजें करते हैं जो पाठ / html में नहीं की जा सकती हैं - और यदि आप कर रहे हैं Doctype और xmlns को बदल रहा है, तो आप उन चीजों को नहीं करेंगे। स्टिक टू टेक्स्ट / html। उस मामले के लिए, आप HTML 4.01 से चिपके रह सकते हैं।
क्वेंटिन

हाँ, मैं इसे समझता हूं और मुझे लगता है कि "समस्याएं" इस तरह से वेब डेवलपमेंट में बहुत बार सामने आती हैं। विनिर्देशों / RFC में "चाहिए" के लिए धन्यवाद!
एलेक्सवी

2
आपको शायद यह पढ़ना चाहिए: इससे पहले कि आप वैरी का उपयोग करने पर विचार करें, blogs.msdn.com/ieinternals/archive/2009/06/17/…
एरिकावल

1
इस वीडियो में Vary:हेडर के बारे में अच्छी व्याख्या है ।
कन्नन मोहन

जवाबों:


94
  • cache-controlहैडर एक कैशिंग प्रॉक्सी एक प्रतिक्रिया की "ताजगी" बताने के लिए एक HTTP सर्वर के लिए प्राथमिक तंत्र है। (यानी, कैश में प्रतिक्रिया को स्टोर करने के लिए कैसे / कब तक)

  • कुछ स्थितियों में, cache-controlनिर्देश अपर्याप्त हैं। HTTP वर्किंग ग्रुप की एक चर्चा को यहां एक पृष्ठ के रूप में संग्रहीत किया गया है, जो केवल भाषा के साथ बदलता है। यह अलग-अलग हेडर के लिए सही उपयोग का मामला नहीं है, लेकिन हमारी चर्चा के लिए संदर्भ मूल्यवान है। (हालांकि मेरा मानना ​​है कि वैरी हेडर उस मामले में समस्या को हल करेगा, एक बेहतर तरीका है।) उस पेज से:

Vary उन मामलों के लिए सख्ती से है जहां यह सर्वर को क्या करना है को दोहराने के लिए एक प्रॉक्सी के लिए निराशाजनक या अत्यधिक जटिल है।

एक आकस्मिक उदाहरण:

आपके HTTP सर्वर का एक बड़ा लैंडिंग पृष्ठ है। आपके पास एक ही URL के साथ दो अलग-अलग पृष्ठ हैं, जो इस बात पर निर्भर करता है कि उपयोगकर्ता पहले भी रहा है। आप कुकीज़ के आधार पर अनुरोधों और उपयोगकर्ता की "विज़िट काउंट" के बीच अंतर करते हैं। लेकिन - चूँकि आपके सर्वर का लैंडिंग पृष्ठ इतना बड़ा है, आप चाहते हैं कि यदि संभव हो तो प्रतिक्रिया को कैश करने के लिए मध्यस्थ प्रॉक्सी करें।

कैशिंग प्रॉक्सी को यह जानकारी देने के लिए URL, अंतिम-संशोधित और कैश-कंट्रोल हेडर अपर्याप्त हैं, लेकिन यदि आप जोड़ते हैं Vary: Cookie, तो कैश इंजन अपने कैशिंग निर्णयों में कुकी शीर्षलेख जोड़ देगा।

अंत में, छोटे ट्रैफ़िक के लिए, डायनेमिक वेब साइट्स - मैंने हमेशा सरल Cache-Control: no-cache, no-storeऔर Pragma: no-cacheपर्याप्त पाया है ।

संपादित करें - अपने प्रश्न का अधिक सटीक उत्तर देने के लिए: HTTP अनुरोध शीर्ष लेख 'स्वीकार' सामग्री-प्रकारों को परिभाषित कर सकता है जिसे ग्राहक संसाधित कर सकता है। यदि आपके पास एक ही URL पर एक ही सामग्री की दो प्रतियां हैं, केवल सामग्री-प्रकार में भिन्न है, तो उपयोग Vary: Acceptकरना उचित हो सकता है।

अपडेट 11 सितंबर 12:

मैं उन दो कड़ियों में शामिल हूं, जो टिप्पणियों में दिखाई दिए हैं क्योंकि यह टिप्पणी मूल रूप से पोस्ट की गई थी। वे वास्तविक दुनिया के उदाहरणों (और समस्याओं) के लिए दोनों उत्कृष्ट संसाधन हैं वैरी के साथ: स्वीकार करें; आईआईएफ आप इस जवाब को पढ़ रहे हैं आपको उन लिंक को भी पढ़ना होगा।

एरिकला, बकाया एरिकला से, वैरी हेडर के साथ इंटरनेट एक्सप्लोरर के व्यवहार पर और डेवलपर्स के सामने प्रस्तुत कुछ चुनौतियां: आईई में वैरी हैडर प्रिवेंट कैशिंग । संक्षेप में, IE (पूर्व IE9) वैरी हेडर का उपयोग करने वाली किसी भी सामग्री को कैश नहीं करता है क्योंकि अनुरोध कैश में HTTP अनुरोध हेडर शामिल नहीं है। एरिकला (वास्तविक दुनिया में एरिक लॉरेंस) IE टीम में एक प्रोग्राम मैनेजर है।

दूसरा एरन मेदान से है, और क्रोम में वैरी-संबंधी अप्रत्याशित व्यवहार की एक ऑन-गोइंग चर्चा है: बैकिंग वैरी हेडर को सही ढंग से संभाल नहीं करता है । यह IE के व्यवहार से संबंधित है, सिवाय इसके कि क्रोम देवों ने एक अलग दृष्टिकोण लिया - हालांकि ऐसा प्रतीत नहीं होता है कि यह एक जानबूझकर विकल्प था।


3
Chrome में बैक ब्राउज़र बटन के साथ संयोजन के बारे में सावधान रहें, इस बग पर एक लौ युद्ध की तरह है (जो अब किसी कारण से wontfix है) code.google.com/p/chromium/issues/detail?id=94369
Eran मेडन

6
@EranMedan Chrome बग को ठीक कर दिया गया है।

59

Vary: Acceptबस कहता है कि Acceptअनुरोध में शीर्ष लेख के आधार पर प्रतिक्रिया उत्पन्न की गई थी । एक अलग Acceptहेडर के साथ एक अनुरोध को एक अलग प्रतिक्रिया मिल सकती है।

(आप देख सकते हैं कि लिंक किया गया PHP कोड दिखता है $HTTP_ACCEPT। यह Acceptअनुरोध हेडर का मूल्य है ।)

HTTP कैश के लिए, इसका मतलब है कि प्रतिक्रिया को अतिरिक्त देखभाल के साथ कैश किया जाना चाहिए। यह केवल उसी Acceptहेडर के साथ बाद के अनुरोधों के लिए एक वैध मैच होने जा रहा है ।

अब यह केवल तभी मायने रखता है जब पेज पहले स्थान पर उपलब्ध हो। डिफ़ॉल्ट रूप से, PHP पृष्ठ नहीं हैं। एक PHP पेज कुछ हेडर ( Expiresउदाहरण के लिए) भेजकर आउटपुट को कैचीबल के रूप में चिह्नित कर सकता है । लेकिन क्या और कैसे करना है यह एक अलग सवाल है।


क्या यह "मिल सकता है" या यह "मिलना चाहिए" है?
पचेरियर

6
@Pacerier "मिल सकता है" सही है। Vary: Acceptइसका मतलब यह नहीं है कि हर एक संभव अलग Acceptहेडर मूल्य एक अलग और अद्वितीय प्रतिक्रिया पैदा करता है। इसका मतलब केवल यह है कि एक अलग Acceptहेडर अलग प्रतिक्रिया उत्पन्न कर सकता है
जेसन ऑरेन्डोर्फ


2

वास्तव में जल्द ही (और क्रोम में पहले से ही) नई सुविधाओं की एक महत्वपूर्ण संख्या है जो Varyहेडर को बहुत उपयोगी बनाती है। उदाहरण के लिए, क्लाइंट संकेत पर विचार करें । जब छवियों के संबंध में उपयोग किया जाता है, उदाहरण के लिए, क्लाइंट संकेत किसी सर्वर को संसाधनों पर निर्भर करने की अनुमति देता है जैसे कि चित्र:

  • इमेज की चौड़ाई
  • व्यूपोर्ट चौड़ाई
  • ब्राउज़र द्वारा समर्थित एन्कोडिंग का प्रकार (WebP के अनुसार)
  • डाउनलिंक (अनिवार्य रूप से नेटवर्क की गति)

तो एक सर्वर जो उन सुविधाओं का समर्थन करता है, वह Varyहैडर को इंगित करने के लिए सेट करेगा ।

Chrome Varyप्रत्येक अनुरोध के लिए हेडर के भाग के रूप में "इमेज / वेबप" सेट करके वेबपी सपोर्ट का विज्ञापन करता है । इसलिए एक सर्वर वेबपी के रूप में एक छवि को फिर से लिख सकता है यदि ब्राउज़र इसका समर्थन करता है, तो प्रॉक्सी को हेडर की जांच करने की आवश्यकता होगी ताकि वेबपी छवि को कैश न करें और फिर इसे उस ब्राउज़र की सेवा दें जो वेबपी का समर्थन नहीं करता है। जाहिर है, अगर आपका सर्वर ऐसा नहीं करता है, तो इससे कोई फर्क नहीं पड़ेगा। इसलिए चूंकि सर्वर की प्रतिक्रिया Acceptअनुरोध हेडर पर भिन्न होती है , इसलिए प्रतिक्रिया में यह शामिल होना चाहिए ताकि प्रॉक्सी को भ्रमित न करें:

Vary: Accept

एक अन्य उदाहरण छवि की चौड़ाई हो सकती है। मोबाइल ब्राउज़र पर Widthहेडर एक उत्तरदायी छवि के लिए काफी छोटा हो सकता है, इसकी तुलना में अगर यह डेस्कटॉप ब्राउज़र से देखा जाए तो क्या होगा। तो उस मामले Widthमें Varyशीर्ष लेख में जोड़ा जाएगा प्रॉक्सी प्रॉक्सी के लिए आवश्यक है कि वह छोटे मोबाइल संस्करण को कैश न करें और इसे डेस्कटॉप ब्राउज़र, या विशेष वर्जन में परोसें। उस स्थिति में, शीर्ष लेख में यह शामिल हो सकता है:

Vary: Accept, Width

या मामले में कि एक सर्वर ने क्लाइंट के सभी ऐनक का समर्थन किया, हेडर कुछ इस तरह होगा:

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