अपाचे 200-ठीक क्यों भेजता है जबकि अंतिम-संशोधित मैच यदि संशोधित-के बाद से?


10

मैं अपनी कैशिंग रणनीति के बारे में एक मूल व्यवहार रखने की कोशिश कर रहा हूं: फ़ाइलों को कैश किया जाना चाहिए, और हर बार सर्वर के साथ अमान्य होना चाहिए। इसलिए मैं अपाचे को 304 वापस भेजना चाहूंगा।

यहां वह संवाद है जो प्रत्येक ब्राउज़र के लिए ताज़ा होता है:

Status Code:200 OK

Request Headers

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie: ...
Host:...
If-Modified-Since:Tue, 14 Oct 2014 15:10:37 GMT
If-None-Match:"1461-505636af08fcd-gzip"
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36

Response Headers

Accept-Ranges:bytes
Cache-Control:No-cache
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:1412
Content-Type:text/html
Date:Tue, 14 Oct 2014 16:58:05 GMT
ETag:"1461-505636af08fcd-gzip"
Keep-Alive:timeout=5, max=99
Last-Modified:Tue, 14 Oct 2014 15:10:37 GMT
Server:Apache/2.4.6 (Ubuntu)
Vary:Accept-Encoding

(यह क्रोम devtools से है, डिसेबल कैश के साथ अनियंत्रित)

आप देख सकते हैं कि प्रतिक्रिया में कैश-कंट्रोल: नो-कैश हैडर है, और यह कि इफ़-संशोधित-हेडर अंतिम-संशोधित से मेल खाता है। ETag से भी मेल खाता है।

क्या अपाचे को उस मामले में 304 नहीं भेजना चाहिए?

संपादित करें

के साथ अपाचे में ETags अक्षम करना

 Header  unset ETag

कैशिंग व्यवहार को अधिक अनुमानित बनाता है ...


मुझे लगता है Cache-Control:max-age=0कि कैश को अक्षम कर दिया गया है, इसलिए आप Cache-Control:No-cacheप्रतिक्रिया देखें ।
थोरियमबीआर

मैंने स्पष्ट रूप से कैश-कंट्रोल सेट किया: मेरे अपाचे कॉन्फिगर में नो-कैश क्योंकि w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1 से , मैं समझता हूं कि यह प्रत्येक अनुरोध के लिए अमान्य है । क्या पुनर्मूल्यांकन से तात्पर्य फ़ाइल को पुनः भेजने से है? मैं कहूंगा कि यदि संशोधित के बाद से यह प्रयोग करना चाहिए निर्धारित करने के लिए अगर यह एक 200 या एक 304 है
zrz

जवाबों:


8

यह एक पुरानी बग प्रतीत होती है , यह बताते हुए कि क्यों Header unset ETagफर्क पड़ता है।

अपाचे 2.4.0+ स्वचालित रूप से ईटाग को संपीड़न विधि का नाम देता है (जैसा कि आपके हेडर में देखा गया है), और एक 304 प्रतिक्रिया को रोकता है।

Mod_deflate के नवीनतम संस्करण एक DeflateAlterETag का समर्थन करते हैं जिसका उपयोग इस व्यवहार को नियंत्रित करने के लिए किया जा सकता है:

DeflateAlterETag NoChange

3
यह सही है लेकिन Apache 2.4 में वह विकल्प नहीं है, केवल Apache 2.5। हालाँकि, व्यक्तिगत रूप से मुझे ETags नहीं मिल रहा है, क्योंकि अपाचे उन्हें अंतिम संशोधित तिथि से हटा देता है, बजाय फ़ाइल सामग्री के। इसलिए ईटैग्स को बंद करना इफ़-मोडिफ़ाइड-चूंकि हेडर पर वापस आता है, जो वैसे भी अंतिम संशोधित तिथि पर आधारित है। आप अपाचे में ETag को आकार, अंतिम-संशोधित और / या इनोड के आधार पर बदल सकते हैं - आकार और अंतिम रूप से डिफ़ॉल्ट डिफ़ॉल्ट होने के साथ - लेकिन, जब तक वे फ़ाइल सामग्री के चेकसम के आधार पर ETag की गणना करने के लिए एक विकल्प जोड़ते हैं, इसका सीमित उपयोग IMHO के। इसलिए मैं उन्हें बंद कर देता हूं।
बैरी पोलार्ड

1
@ बजाजडीपी जो समझ में आता है। 2.5 में DeflateAlterETag Removeसिर्फ एक विकल्प होता है
मैथियास आर जेसन

0

यह अनुरोध थोड़ा अजीब होने के कारण बाहर खड़ा है:

Cache-Control:max-age=0

हालांकि अधिक महत्वपूर्ण यह है कि, मैं ध्यान देता हूं कि दी गई सामग्री html है। क्या यह गतिशील रूप से उत्पन्न हो रहा है? Apache MAY ने 304 प्रतिसाद भेजा, लेकिन जब तक आप स्थैतिक सामग्री परोस नहीं रहे हैं, यह अपाचे का काम उस कॉल को करना नहीं है, और यह आपके एप्लिकेशन लॉजिक पर आ जाता है। उदाहरण के लिए, अधिकांश php एप्लिकेशन को ऐसी चीजों के लिए सीमित समर्थन प्राप्त होता है।

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


अनुरोधित फ़ाइल एक स्थिर html फ़ाइल है, जिसके लिए अपाचे को संशोधन समय मिलता है। (अंतिम-संशोधित: मंगल, 14 अक्टूबर 2014 15:10:37 GMT)। अधिकतम आयु = 0 शीर्ष लेख, क्रोम द्वारा भेजे गए अनुरोध में है जब मैं URL टाइप करता हूं और Enter दबाता हूं। क्या यह पिछली प्रतिक्रियाओं के कारण है?
zrz

मैंने पढ़ा है कि क्रोम स्वचालित रूप से अनुरोध करने के लिए कैश-कंट्रोल: अधिकतम-आयु = 0 जोड़ता है (पहली बार जब आप क्रोम लोड करते हैं, तो URL टाइप करें, हिट दर्ज करें)। लेकिन यह अन्य सर्वरों को प्रभावित नहीं करता है (CDN अनुरोध में अधिकतम आयु = 0 के साथ भी 304 भेजते हैं)।
zrz

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

0

यदि आपके पास अपाचे को कॉन्फ़िगर किया गया है Cache-Control:No-cache, तो अपाचे HTTP 304 Not modifiedग्राहक को कभी नहीं भेजेगा ।

यदि आप कुछ अनुरोधों को रद्द करना चाहते हैं, तो Cache-Control:No-cacheकेवल उन पृष्ठों पर रखें जहाँ आपको इसकी आवश्यकता है। आपको सभी संसाधनों को अमान्य करने की आवश्यकता नहीं है, और आप ऐसा करके बैंडविड्थ को बर्बाद कर रहे हैं।


मुझे लगता है कि यह शब्द "पुनर्जीवित" से भ्रमित हो रहा है। मेरे लिए, यह जांचने का मतलब है कि क्या यह 304 है। क्या मैं गलत हूं?
zrz

तुम गलत हो। Revalidate क्लाइंट को सभी डेटा फिर से भेजने और उसे फिर से सब कुछ पढ़ने के लिए मजबूर करना है, भले ही उसके पास पहले से ही समान जानकारी हो। आप मूल रूप से हर क्लाइंट पर कैश को अक्षम कर रहे हैं।
थोरियम बीआर

इससे बहुत कुछ स्पष्ट हो जाता है। अंतिम बात जो मुझे समझनी चाहिए, वह यह है कि अपाचे ने कुछ संसाधनों (उदाहरण के लिए पीएनजी) के लिए 304 भेजा है, जबकि मेरे पास अभी भी है कि कैश-कंट्रोल ने प्रतिक्रिया में नो-कैश सेट किया और अनुरोध में अधिकतम-आयु = 0। कोई सुराग ?
zrz

@ थोरियम बीआर यदि मैंने आपको सही तरीके से व्याख्या की है, तो आपके दोनों उत्तर यहां गलत हैं; नो-कैश (नो-स्टोर के विपरीत) का अर्थ "कैश न करें" नहीं है, और यदि सामग्री नहीं बदली है तो 304 का परिणाम हो सकता है। वास्तव में ओपी को यह उम्मीद थी लेकिन एटा के मुद्दे के कारण ऐसा नहीं हो रहा था। री-रिवाइंड करने से संबंधित है कि बासी सामग्री को कैसे संभाला जाता है और हमेशा "डेटा को फिर से" नहीं भेजता है।
निक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.