“304 नॉट मॉडिफाइड” कैसे काम करता है?


174
  • "304 संशोधित नहीं" प्रतिक्रियाएं कैसे उत्पन्न होती हैं?

  • एक ब्राउज़र यह कैसे निर्धारित करता है कि HTTP अनुरोध का जवाब 304 है?

  • क्या यह ब्राउज़र द्वारा सेट किया गया है या सर्वर से भेजा गया है?

  • यदि सर्वर द्वारा भेजा जाता है, तो सर्वर कैश में उपलब्ध डेटा को कैसे जानता है, यह भी कि यह किसी छवि को 304 कैसे सेट करता है?

मेरा अनुमान है, अगर यह ब्राउज़र द्वारा उत्पन्न होता है:

function is_modified()
{
    return get_data_from_cache() === get_data_from_url();
}

function get_data_from_cache()
{
    return some_hash_or_xxx_function(cache_data);
}

function get_data_from_url()
{
     return some_hash_or_xxx_function(new_data);
}

function some_hash_or_xxx_function(data)
{
     // Do something with the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

मैं डेटा प्राप्त करने, पार्स करने और इसे अपने डेटाबेस में लाने के लिए तृतीय पक्ष API प्रदाता पर निर्भर हूं। हर अनुरोध के दौरान डेटा बदल सकता है या नहीं, लेकिन हैडर हमेशा भेजता है 200। मैं पार्स नहीं करना चाहता, अंतिम यूबी आईडी को डीबी और इतने पर जांचना ... डेटा में परिवर्तन का निर्धारण करने के लिए, और न ही परिणाम की तुलना सीधे मैंने की md5(), sha1()और crc32()परिणाम को ठीक किया और ठीक काम करता है, लेकिन मैं सोच रहा हूं निर्धारित करने के लिए एल्गोरिथ्म 304

मैं अपने डेटा में परिवर्तन निर्धारित करने के लिए उसी तरह के एल्गोरिदम का उपयोग करना चाहता हूं।


2
हां, मैंने इस बात के लिए गुगली दी कि कैसे 304 संशोधित काम नहीं करते , लेकिन उन्हें कोई जवाब नहीं मिला।
वेनोमवेंडर

1
आपको थोड़ा और सामान्य होने की आवश्यकता है। google.com/search?q=http%20caching
SLaks

जवाबों:


200

जब ब्राउज़र अपने कैश में कुछ डालता है, तो यह सर्वर से Last-Modifiedया ETagहेडर को भी स्टोर करता है।

ब्राउज़र तब If-Modified-Sinceया If-None-Matchहेडर के साथ एक अनुरोध भेजता है , जो सर्वर को 304 भेजने के लिए कहता है यदि सामग्री में अभी भी तारीख या ईटाग है।

सर्वर को प्रत्येक संसाधन के प्रत्येक संस्करण के लिए दिनांक-संशोधित या ETag की गणना करने के कुछ तरीके की आवश्यकता होती है; यह आमतौर पर फाइल सिस्टम या एक अलग डेटाबेस कॉलम से आता है।


1
ETagकीवर्ड, हेडर के साथ की जाँच की है ETagदोनों में ही रहता है Response Headersऔर Response Headers From Cache, आप एल्गोरिथम के पीछे बता सकते हैं ETag। मैंने अपनी आवश्यकता बताते हुए अपना प्रश्न अपडेट कर दिया है।
वेनोमवेंडर

4
@VenomVendor: ETagकेवल एक फ़ील्ड है जहाँ सर्वर एक अद्वितीय ID (आमतौर पर हैश या संस्करण संख्या या वेक्टर घड़ी) संग्रहीत कर सकता है। यह आपको उस आईडी की गणना करने में मदद नहीं करता है; यह आपके सर्वर-साइड कोड पर निर्भर है।
SLAKs

@SLaks: यदि पृष्ठ में db कॉल है तो क्या होता है ... एक मौका है कि db में डेटा बदल गया होगा..इस मामले में अंतिम-संशोधित कॉल की जांच करने का कोई मतलब नहीं है, सही है। .क्या यह इस स्थिति को देखा जाता है?
user1050619

3
@ user1050619: यह सुनिश्चित करने के लिए आपके सर्वर पर निर्भर है कि ETag सटीक है। यदि आप किसी DB से डेटा दिखाते हैं, तो आपको उसे शामिल करना होगा।
SLaks

एक बात जो अभी भी स्पष्ट नहीं है कि क्या आपके पास एक बड़ा है max-ageतो क्या ब्राउज़र को अनुरोध करने की आवश्यकता है? (जैसा कि यह 304 में स्टब कर सकता है और अनुरोध नहीं कर सकता है) ... आप यह चाहते हैं जैसे "फिंगरप्रिंट" संपत्ति (वे हमेशा के लिए अच्छे हों)। और क्या बात है max-age...
एंडी हेडन

19

अंतिम-संशोधित: अनुरोधित वस्तु के लिए अंतिम संशोधित तिथि

यदि संशोधित-चूंकि: अंतिम संशोधित तिथि अपरिवर्तित है, तो 304 को संशोधित नहीं किया जा सकता है।

ETag: एक ETag एक अपारदर्शी पहचानकर्ता है जो एक वेब सर्वर द्वारा एक URL पर पाए जाने वाले संसाधन के विशिष्ट संस्करण को सौंपा जाता है। यदि उस URL पर संसाधन प्रतिनिधित्व कभी बदलता है, तो एक नया और अलग ETag असाइन किया जाता है।

अगर-कोई नहीं-मैच: यदि ईटैग अपरिवर्तित है, तो 304 को संशोधित नहीं किया जा सकता है।

ब्राउज़र एक तारीख (अंतिम-संशोधित) या आईडी (ETag) के साथ कैश स्टोर करता है, जब आपको फिर से URL का अनुरोध करने की आवश्यकता होती है, तो ब्राउज़र हेडर के साथ अनुरोध संदेश भेजता है:

यहां छवि विवरण दर्ज करें

यदि विवरण गलत है, तो सर्वर 304 लौटाएगा और ब्राउज़र कैश का उपयोग करेगा।

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