ईटाग बनाम हैदर एक्सपायर


359

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

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

मैं कुछ खास नहीं करना चाहता हूं, जैसे फाइल का नाम बदलना या यूआरएल के खत्म होने पर कुछ अजीबोगरीब आकर्षण डालना, ताकि इसे पूरा न किया जा सके।

इसके अलावा, क्या मुझे इसके समर्थन के लिए अपने PHP स्क्रिप्ट में अपने अंत में प्रोग्रामेटिक रूप से करने की आवश्यकता है या यह सब अपाचे है?


1
developer.mozilla.org/en-US/docs/Web/HTTP/Caching (सामान्य रूप में अच्छा)
क्रिस्टोफ रूसो

जवाबों:


677

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

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

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

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


12
आपको यह भी देखना चाहिए कि क्या आपको एक्सपायरी के बजाय कैश-कंट्रोल का उपयोग करना चाहिए। मेरी समझ यह है कि समाप्ति के बाद कैश-कंट्रोल पेश किया गया था और आपको अधिक नियंत्रण देता है। देखें stackoverflow.com/questions/5799906/…
लुइस पेरेज़

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

8
कहते हैं कि हम दोनों का उपयोग करेंगे। एक्सपायर समय समाप्त होने पर क्या होता है, लेकिन फ़ाइल नहीं बदली जाती है (Etag समान है)? सर्वर 304 वापस आ जाएगा और फ़ाइल ब्राउज़र कैश से दी जाएगी। मेरा प्रश्न यह है कि क्या इस समय की समय सीमा समाप्त हो जाएगी?
user345602

2
ETAG और एक्सपायर हेडर को नॉन-जीरो वैल्यू पर सेट करने में सावधानी बरतें । इससे दौड़ की स्थिति पैदा हो सकती है। देखें jakearchibald.com/2016/caching-best-practices
वेस्टन

2
क्या सर्वरों को यह बताना संभव है कि वे इनकोड या टाइमस्टैम्प का उपयोग बिल्कुल नहीं करते हैं? इसके अलावा, ईटीजीएस के लिए उनकी आवश्यकता क्यों है, यदि इसका उपयोग केवल सामग्री का प्रतिनिधित्व करने के लिए किया जाता है?
सेजा

108

Etag और अंतिम-संशोधित हेडर सत्यापनकर्ता हैं

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

एक्सपायर और कैश-कंट्रोल ताज़ा जानकारी दे रहे हैं ।

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

तो आमतौर पर सवाल यह है कि उपयोग करने के लिए कौन सा सत्यापनकर्ता है, etag या अंतिम-संशोधित, और कौन सा उपयोग करने, समाप्त करने या कैश-नियंत्रण के लिए infomation शीर्ष लेख को ताज़ा करता है।


30

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

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

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

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


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

1
@GMsoF आप इस पर एक नज़र रखना चाहते हो सकता है: tools.ietf.org/html/rfc7232#section-2.1
Medeiros

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

18

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

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


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

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

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

@ जॉन: हाँ, मुझे लगता है कि मैं स्थैतिक सामग्री के बारे में सोच रहा था जो कि जब मैंने लिखा तो कभी नहीं बदलता।
डेविड जे

2
@ जॉन बाचिर: उस शॉल्ड तेह एक्सपेक्टेड बियहवाइर हो सकता है, लेकिन ब्राउज़र को लगता है कि वैसे भी कम से कम एक नए संस्करण की जांच के लिए सर्वर को हिट करना होगा। मैंने इस मुद्दे के बारे में एक और सवाल खोला: stackoverflow.com/questions/10048740/…
Marco Demaio

13

एक और सारांश:

आपको दोनों का उपयोग करने की आवश्यकता है। ETags एक "सर्वर साइड" जानकारी है। एक्सपायर एक "क्लाइंट साइड" कैशिंग हैं।

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

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


2
इस समय सीमा समाप्त होने की स्थिति में आपको मूल रूप से अपने js का नाम बदलने और इसे अपने HTML में बदलने की आवश्यकता है, और आशा है कि आपने HTML फ़ाइल की समयसीमा 1 वर्ष भी निर्धारित नहीं की है।
EralpB

1

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

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

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


1

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


0

ETag का उपयोग यह निर्धारित करने के लिए किया जाता है कि संसाधन को कॉपी का उपयोग करना चाहिए या नहीं। और समाप्ति की तरह हैडर को कैश-कंट्रोल क्लाइंट को बताया जाता है कि कैश दशकों से पहले, ग्राहक को स्थानीय संसाधन प्राप्त करना चाहिए।

आधुनिक साइटों में, अक्सर हैश नाम की एक फ़ाइल की पेशकश की जाती है, जैसे app.98a3cf23.js, ताकि एक्सपायर हैडर का उपयोग करने के लिए यह एक अच्छा अभ्यास हो। इसके अलावा, यह नेटवर्क की लागत को भी कम करता है।

आशा है ये मदद करेगा ;)

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