304 / इफ़-संशोधित-चूंकि / HEAD अनुरोधों को रोकने के लिए हेडर


31

सामग्री के कैश होने के बाद मुझे सर्वर से सभी अनुरोधों को एकमुश्त रोकने के लिए क्या हेडर भेजना चाहिए?

हमारे पास एक बहुत ही उच्च विलंबता सर्वर (Sigh, VMWare) है, यहां तक HEADकि सर्वर को अनुरोध भेजने पर + 40ms लगते हैं।

वर्तमान में ये हेडर भेजे / प्राप्त किए जा रहे हैं;

पहला निवेदन

ग्राहक भेजता है;

GET http://dugong:8080/Rvi24mYJkxFRGNzq73PPvgWGh1j/IMG_2071.jpg HTTP/1.1
Host: dugong:8080
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:9.0) Gecko/20100101 Firefox/9.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Pragma: no-cache, no-cache, no-cache
Cache-Control: no-cache, no-cache, no-cache

सर्वर प्रतिक्रिया करता है;

HTTP/1.1 200 OK
Server: nginx/1.0.11
Date: Wed, 01 Feb 2012 14:51:51 GMT
Content-Type: text/plain
Vary: Accept-Encoding
Last-Modified: Tue, 31 Jan 2012 10:45:11 GMT
Content-Length: 14
Expires: Thu, 31 Jan 2013 14:51:51 GMT
Cache-Control: max-age=31536000

इसलिए यह भविष्य में 365 दिनों के लिए सेट Cache-Controlऔर Expiresहेडर भेजता है । दुर्भाग्य से दूसरे रिफ्रेश पर यह If-Modified-Sinceहेडर के साथ फिर से ऑब्जेक्ट का अनुरोध करता है ।

दूसरा निवेदन

GET http://dugong:8080/Rvi24mYJkxFRGNzq73PPvgWGh1j/IMG_2071.jpg HTTP/1.1
Host: dugong:8080
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:9.0) Gecko/20100101 Firefox/9.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
If-Modified-Since: Tue, 31 Jan 2012 10:45:11 GMT
Cache-Control: max-age=0

प्रतिक्रिया;

HTTP/1.1 304 Not Modified
Server: nginx/1.0.11
Date: Wed, 01 Feb 2012 14:58:00 GMT
Vary: Accept-Encoding
Expires: Thu, 31 Jan 2013 14:58:00 GMT
Cache-Control: max-age=31536000

दुर्भाग्य से मूर्खतापूर्ण पुराने प्रॉक्सी सॉफ्टवेयर के कारण हम उपयोग नहीं कर सकते हैं Keep-Alive, या किसी अन्य सर्वर / प्रॉक्सी को आवेदन के सामने नहीं रख सकते हैं । हम सर्वर के प्रदर्शन में सुधार नहीं कर सकते हैं और नेटवर्क विलंबता को कम कर सकते हैं। मैं यह पता लगाने की कोशिश कर रहा हूं कि 301 अनुरोधों से छुटकारा पाने के लिए हम क्या हेडर भेज सकते हैं। मैंने ETags का उपयोग करने की कोशिश की है, लेकिन इससे कोई फर्क नहीं पड़ता, यह अभी भी एक If-modified-sinceहेडर भेजता है । मैंने Last-Modifiedहेडर को हटाने की भी कोशिश की है, लेकिन यह बिना किसी कैशिंग के मानक जीईटी अनुरोध का कारण बनता है (लॉग्स की जांच की, सर्वर अभी भी अनुरोध प्राप्त कर रहा है)।

ग्राहक फ़ायरफ़ॉक्स (अधिकतर), IE 7, 8 और (कुछ) 9, क्रोम और सफारी का मिश्रण हैं, लेकिन यह व्यवहार परीक्षण किए गए सभी ब्राउज़रों में दिखाई दे रहा है।

टी एल; डॉ;

भयानक नेटवर्क, जो हेडर मुझे ग्राहकों को यह बताने के लिए भेजने चाहिए कि कभी भीIf-modified-since सर्वर को अपने कैश को सत्यापित करने के लिए अनुरोध भेजें , और Expiresहेडर पूरा होने तक सामग्री को कैश किया जाए ?

मैं शायद कुछ स्पष्ट याद कर रहा हूं, लेकिन मैं जो कुछ भी कोशिश करता हूं, वही परिणाम देता है।

हमारे पास एक NGINX सर्वर है, जो हमारे एप्लिकेशन सर्वर के सामने बैठा है, इसलिए मैं किसी भी हेडर को जोड़ सकता हूं / हटा सकता हूं। हमारा प्रॉक्सी, Keep-Alive का समर्थन नहीं करता है और उनके नेटवर्क के प्रदर्शन को बेहतर बनाने का कोई तरीका नहीं है। भयानक सॉफ्टवेयर डिज़ाइन के कारण वेब ऐप प्रत्येक पृष्ठ लोड (हाँ, एंटरप्राइज़ सॉफ़्टवेयर बेकार) पर प्रति वस्तु ~ 40-50ms की विलंबता के साथ +100 संसाधनों को लोड करता है।


1
हम्म, यह अजीब है। समय सीमा समाप्त हो रही है और अधिकतम आयु शीर्षकों को छवि के आगे अनुरोधों को रोकना चाहिए। संपादित करें: वैसे, JPG भेजने के साथ सौदा क्या है text/plain?
असंतुष्ट

1
। मेरी दुनिया = में आपका स्वागत है) (यह वास्तव में एक पाठ फ़ाइल है कि 'नमस्ते विश्व' मेरे परीक्षण के लिए शामिल है, सॉफ्टवेयर सिर्फ सभी फाइलों को क्रमिक रूप से IMG_xxxx.jpg प्रकार का नाम बदलता है परवाह किए बिना कूल हुह)।?
धब्बा

http अनुरोध हेडर सेट करने के लिए आप क्या उपयोग कर रहे थे?
बारलोप

जवाबों:


25

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

  • कैश्ड प्रविष्टि की कोई समाप्ति तिथि नहीं है और ब्राउज़र सत्र में पहली बार सामग्री को एक्सेस किया जा रहा है
  • कैश्ड प्रविष्टि की समाप्ति तिथि है लेकिन यह समाप्त हो गई है
  • उपयोगकर्ता ने ताज़ा बटन पर क्लिक करके या F5 दबाकर एक पेज अपडेट का अनुरोध किया है

इसलिए यदि आप अपने कैशिंग का परीक्षण करने के लिए पृष्ठ को पुनः लोड कर रहे हैं, तो यह काम नहीं करेगा क्योंकि ब्राउज़र छवियों का पुनः अनुरोध करेगा। लिंक पर क्लिक करने का प्रयास करें और फिर पहले पृष्ठ पर एक और लिंक। यदि आपके उपयोगकर्ता नियमित रूप से पृष्ठों को फिर से लोड कर रहे हैं, तो आपको इसे रोकने के लिए अपनी साइट / ऐप संरचना को फिर से जोड़ना होगा।

एक चीज जो कैश कंट्रोल हेडर में "पब्लिक" जोड़ने में मदद कर सकती है, अर्थात Cache-Control: public, max-age=31536000। मैंने हाल ही में यह भी सीखा कि एक वर्ष से अधिक की समाप्ति की तारीख अमान्य है। चूंकि आपकी एक्सपायरी डेट एक वर्ष है, इसलिए संभवत: कुछ दिनों या हफ्तों तक कम करना यह सुनिश्चित करेगा कि फ़ाइल ब्राउज़र कैश में रहती है और खारिज नहीं की जाती है।


दिलचस्प है, मैं 60 दिनों की अवधि समाप्त कर दूंगा और सार्वजनिक ध्वज जोड़ूंगा, और देखूंगा कि क्या होता है। यह F5s (फायरबग और सर्वर लॉग के अनुसार) के बजाय लिंक-क्लिक पर हो रहा था
स्मज करें

तकनीकी रूप से, HTTP / 1.1 युक्ति केवल यह कहती है कि "सर्वर भविष्य में एक वर्ष से अधिक समय सीमा समाप्ति की तारीखें नहीं भेजते हैं" (संभवत: इसलिए कि यह समाप्ति से पहले एक हास्यास्पद समय है) और भविष्य में "लगभग एक वर्ष" उपयुक्त समाप्ति है। ऐसी सामग्री भेजने का समय जो कभी समाप्त होने की उम्मीद न हो।
इल्मरी करोनें

1
चारों ओर खेलने का एक बिट के बाद, मैंने निष्कर्ष निकाला है कि 365d समाप्ति हमारे ग्राहकों को प्रभावित नहीं कर रही है, हालांकि मैंने इसे सुरक्षित रहने के लिए नीचे गिरा दिया है, ऐसा लगता है कि यह Cache-Control: public,...इस विशिष्ट स्थिति की कुंजी थी।
स्मज करें

क्या आपका मतलब है "सार्वजनिक" हेडर ने अनावश्यक राउंड-ट्रिप तय की? मैंने इसे आजमाया, लेकिन कोई सफलता नहीं मिली ...
phtrivier

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


3

मेरे पास एक ही मुद्दा था, और अनुरोध निश्चित रूप से 304स्थिति के साथ प्रतिक्रिया करने के लिए सर्वर को मार रहे हैं - मैं कुछ सी # के माध्यम से 304 भेज रहा हूं और यह सुनिश्चित करने के लिए कि यह सर्वर को हिट करता है ..

मैंने ही Cache-Control: privateसेट किया था । नहीं max-ageऔर नहीं Expiresयह अपेक्षित रूप से संचालित है; उस सर्वर से टकराएँ If-Modified-Sinceजहाँ मैं अपनी अपेक्षा के अनुरूप मूल्य का परीक्षण करता हूँ और वितरित करता हूँ304 डब्ल्यू / खाली रिस्पॉन्स बॉडी देता - और 200रिस्पांस बॉडी को फुल करता है।

सेटिंग Expiresहेडर200 - (from cache) करने से क्लाइंट पर वांछित परिणाम आए, और कोई HTTP अनुरोध सर्वर से नहीं टकराया।

लेकिन .. मैंने पाया कि BOTH max-age= & Expiresको सेट करने से ब्राउज़र If-Modified-Sinceहेडर नहीं भेज सकते हैं और कैश नहीं कर सकते हैं यदि मूल्यों का मिलान नहीं होता है तो बिलकुल भी नहीं कर सकते हैं

अगर आपको कैशिंग मुद्दे हैं और संयोजन में विभिन्न हेडर का उपयोग करना है, तो कुछ के बारे में पता होना चाहिए।


1

थोड़ा ऑफ-टॉपिक लेकिन शायद मददगार। कैश्ड सामग्री के आपके अनुरोधों के लिए एक और सुधार, सेशनस्टेजेज में कैश करना है ताकि आपको कैशे को मान्य करने के लिए सर्वर से पूछने और 304 प्राप्त करने की आवश्यकता न हो। उदाहरण के लिए Google देखें, कंसोल खोलें और सेशनस्टोरेज लिखें। आप देखेंगे कि वे सेशनस्ट्रीम के साथ CSS या DOM को कैच कर रहे हैं। inc, आप पुराने IE ब्राउज़रों में उपयोग नहीं कर सकते।


0

अपने स्रोत कोड के माध्यम से देखें और सुनिश्चित करें कि किसी अन्य पृष्ठ पर संक्रमण करने के लिए कोई META REFRESH नहीं है। इसके बजाय SendRedirect जैसी किसी चीज़ का उपयोग करें। मेरे सेटअप पर META REFRESH IE में 304s का उत्पादन करता है, लेकिन Chrome में नहीं। sendRedirect या तो ब्राउज़र पर इसका उत्पादन नहीं करता है।

<meta http-equiv="refresh" content="0;URL='nextpage'" />    

बनाम

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