2009-02-01 13 views
323

मैं चारों ओर देखा है, लेकिन अगर मैं दोनों एक ETag और एक हैडर या एक या दूसरे कार्यकाल समाप्ति का उपयोग करना चाहिए यह पता लगाने के लिए सक्षम नहीं किया गया है।ETag बनाम हैडर समय-सीमा समाप्त

मुझे क्या करना कोशिश कर रहा हूँ सुनिश्चित करें कि है कि मेरे फ़्लैश फ़ाइलें (और अन्य छवियों और क्या न केवल अद्यतन है जब वहाँ उन फ़ाइलों में होने वाले बदलाव।

मैं कुछ भी विशेष नहीं करना चाहते है फ़ाइल नाम बदलने या यूआरएल के अंत में कुछ अजीब चार्ज डालने के लिए इसे कैश नहीं किया जाता है।

साथ ही, क्या मुझे कुछ भी करने के लिए प्रोग्रामिंग रूप से मेरे PHP स्क्रिप्ट में प्रोग्रामिंग रूप से करने की ज़रूरत है या यह सब कुछ है अपाचे?

+0

https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching (सामान्य में अच्छा) –

उत्तर

621

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

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

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

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

+36

यह उत्तर अभी मेरा दिन बना दिया। हम इटाग प्रश्न के साथ कुश्ती कर रहे हैं क्योंकि न तो देव और न ही आईटी मैनेजर (जो ईटैग की मांग कर रहे थे) उपयोग-मामलों को पूरी तरह समझा सकते हैं। धन्यवाद! –

+52

मेरा काम यहाँ किया गया है। :) –

+8

आपको यह भी देखना चाहिए कि क्या आपको समाप्त होने की बजाय कैश-कंट्रोल का उपयोग करना चाहिए या नहीं। मेरी समझ यह है कि कैश-कंट्रोल की समाप्ति के बाद पेश किया गया था और आपको अधिक नियंत्रण देता है। Http://stackoverflow.com/questions/5799906/whats-the-difference-between-expires-and-cache-control-headers –

19

डिफ़ॉल्ट रूप से, अपाचे फ़ाइल की इनोड संख्या, अंतिम संशोधित दिनांक, इटाग based on उत्पन्न करेगा, और आकार, जो आप चाहते हैं करने के लिए पूरी तरह से ठीक होना चाहिए। मुझे लगता है कि डिस्क पर फ़ाइल के अंतिम संशोधन समय के आधार पर डिफ़ॉल्ट रूप से एक अंतिम-संशोधित शीर्षलेख भी उत्पन्न होगा, जो आप जो चाहते हैं उसे करने के लिए भी बिल्कुल ठीक है।

आपको शायद भविष्य में एक वर्ष की तारीख में एक एक्सपेयर हेडर भेजना चाहिए (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 के अनुसार) ताकि ब्राउजर जान सकें कि सामग्री कैशेबल है। इसे कॉन्फ़िगर करने के लिए mod_expires पर एक नज़र डालें।

+0

तो ईटाग में अंतिम संशोधित होगा और समाप्ति शीर्षलेख यह बताएगा कि मैं इसे कैश करना चाहता हूं यह और जब मैं अपनी फ़ाइल अपलोड और ओवरराइट करता हूं तो यह फिर से उपयोगकर्ता के कैश पर खींचा जाएगा अन्यथा 304 सही उत्पन्न होगा? – GeoffreyF67

+0

एटाग अंतिम संशोधित तारीख पर एक जटिल तरीके से निर्भर करता है; लेकिन जब आप फ़ाइल को संशोधित करते हैं, तो एटाग बदल जाएगा। फिर ब्राउज़र द्वारा भेजा गया एटैग (फ़ाइल के कैश किए गए संस्करण के लिए) सर्वर पर फ़ाइल के एटाग से मेल नहीं खाएगा, और अपाचे 304 प्रतिक्रिया के बजाय फ़ाइल भेज देगा। –

+5

क्या एक वर्ष हेडर की अवधि समाप्त नहीं होगी क्लाइंट को एक साल के लिए एक नए संस्करण की जांच भी नहीं करेगा? –

97

ETag और अंतिम संशोधित हेडर प्रमाणकों हैं।

वे ब्राउज़र और/या कैश (रिवर्स प्रॉक्सी) को यह समझने में मदद करते हैं कि कोई फ़ाइल/पृष्ठ बदल गया है, भले ही यह एक ही नाम को सुरक्षित रखता हो।

और कैश-नियंत्रणताज़ा जानकारी दे रहे हैं अवधि समाप्त।

इसका मतलब है कि वे प्रॉक्सी के बीच में ब्राउज़र और रिवर्स को सूचित करते हैं, किस समय तक या कितने समय तक, वे पृष्ठ/फ़ाइल को उनके कैश पर रख सकते हैं।

तो सवाल आमतौर पर उपयोग करने के लिए एक वैधकर्ता है, इटैग या आखिरी संशोधित, और जो उपयोग, समाप्ति या कैश-नियंत्रण का उपयोग करने के लिए सूचना हेडर को रीफ्रेश करता है।

26

Expires और Cache-Control हैं "मजबूत कैशिंग हेडर"

Last-Modified और ETag हैं "कमजोर कैशिंग हेडर"

पहले ब्राउज़र की जांच Expires/Cache-Control निर्धारित करने के लिए किया जाए या नहीं सर्वर को एक अनुरोध बनाने के लिए

यदि अनुरोध करना है, तो यह HTTP अनुरोध में Last-Modified/ETag भेज देगा। यदि दस्तावेज़ के Etag मान मेल खाते हैं, तो सर्वर 200 के बजाय 304 कोड भेज देगा, और कोई सामग्री नहीं। ब्राउज़र सामग्री को अपने कैश से लोड करेगा।

+0

क्या आपको कोई दस्तावेज़ "मजबूत और कमजोर" कैशिंग व्यवहार का समर्थन करता है? मुझे एक नहीं मिला, और मेरा क्लाइंट ब्राउज़र अब अंतिम रूप से समाप्त होने पर अंतिम-संशोधित प्राथमिकता को प्राथमिकता देता है, जिसे मैं समझ नहीं पा रहा हूं। – GMsoF

+1

@GMsoF आप इसे देखना चाहते हैं: http://tools.ietf.org/html/rfc7232#section-2.1 – Medeiros

+0

इसलिए, यदि मैं यह सुनिश्चित करना चाहता हूं कि मेरे परिवर्तन तुरंत ग्राहक के लिए प्रचारित हों, लेकिन अभी भी कुछ कैशिंग को लाभ है, मैं केवल अंतिम-संशोधित और ईटीएजी का उपयोग कर सकता हूं? –

10

एक और सारांश:

आप दोनों का उपयोग करने की जरूरत है। ETags एक "सर्वर पक्ष" जानकारी हैं। समाप्ति एक "ग्राहक पक्ष" कैशिंग है।

  • उपयोग ETags को छोड़कर यदि आप एक लोड-संतुलित सर्वर है। वे सुरक्षित हैं और ग्राहकों को यह बताएंगे कि हर बार जब आप अपनी तरफ से कुछ बदलते हैं तो उन्हें आपकी सर्वर फ़ाइलों के नए संस्करण मिलना चाहिए।

  • समय-सीमा समाप्त, सावधानी से किया जाना चाहिए, क्योंकि यदि आप भविष्य में अब तक एक समाप्ति तिथि सेट करें, लेकिन फाइलों immediatelly में से एक (उदाहरण के लिए एक जे एस फ़ाइल) को बदलना चाहते हैं, कुछ उपयोगकर्ताओं को संशोधित संस्करण नहीं मिल सकता है एक लंबे समय तक!

+0

इस अवधि की स्थिति में आपको मूल रूप से अपने जेएस का नाम बदलने और इसे अपने एचटीएमएल में बदलने की जरूरत है, और उम्मीद है कि आपने एचटीएमएल फाइल की 1 साल की अवधि समाप्त नहीं की है। – EralpB

0

एक अतिरिक्त बात मैं कुछ उत्तर चूक गए हों कि उल्लेख करना चाहते हैं दोनों ETags और अपने हेडर में Expires/Cache-control होने के लिए नकारात्मक पहलू है।

आपकी ज़रूरतों के आधार पर यह आपके हेडर में अतिरिक्त बाइट जोड़ सकता है जो पैकेट बढ़ा सकता है जिसका मतलब अधिक टीसीपी ओवरहेड है। दोबारा, आपको देखना चाहिए कि क्या आपके हेडर में दोनों चीजें रखने का ओवरहेड जरूरी है या क्या यह आपके अनुरोधों में अतिरिक्त वजन जोड़ देगा जो प्रदर्शन को कम करता है।

आप काइल सिम्पसन द्वारा इस उत्कृष्ट ब्लॉग पोस्ट पर इसके बारे में अधिक पढ़ सकते हैं: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

1

मेरी नजर में, के साथ समाप्त हैडर, सर्वर, ग्राहक बता सकते हैं, जबकि ETag साथ, सर्वर होगा जब मेरे डेटा बासी होगा ग्राहक के प्रत्येक अनुरोध के लिए etag मान की जांच करें।

संबंधित मुद्दे