2012-10-11 15 views
5

मेरे पास एक वेब सर्वर है जो किसी विशेष यूआरएल के लिए ईटाग प्रदान करता है। जब ब्राउज़र इस यूआरएल के लिए अनुरोध करता है, तो यह उस यूआरएल के सर्वर से पिछली प्रतिक्रिया में मौजूद ईटीएजी-वैल्यू के साथ http-header "If-None-Match" प्रदान करता है। अब, यदि मैं प्रोग्रामिक रूप से अनुरोध-हेडर "अगर-संशोधित-चूंकि" जोड़ता हूं और इसे भविष्य में या पिछली तारीख (इससे कोई फर्क नहीं पड़ता) पर सेट करता है, तो ब्राउज़र "अगर-कोई-मैच" -हेडर भेजने को रोकता है। मैंने इसे फ़ायरफ़ॉक्स और क्रोम दोनों में देखा है (किसी अन्य ब्राउज़र के साथ परीक्षण नहीं किया गया है)। मैं HTTP/1.1 spec से निष्कर्ष निकाला नहीं जा सकता कि यह मामला होना चाहिए। ऐसा क्यों होता है?यदि संशोधित-ओवरराइड ब्राउज़र में यदि कोई नहीं- मैच

यहां एक साधारण कोड उदाहरण है जो परिदृश्य को पुन: पेश करेगा। कोड मानता है कि सर्वर एटाग-हेडर के साथ प्रतिक्रिया करता है।

var request = new XMLHttpRequest(); 
request.open("GET", someUrl, true); 
request.onreadystatechange = function(){}; 

// This statement makes the browser stop sending the "If-None-Match" header 
request.setRequestHeader("If-Modified-Since", "Sat, 29 Oct 1994 19:43:31 GMT"); 

request.send(null); 
+1

आप इसके बजाय http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p4-conditional-21.html पढ़ना चाह सकते हैं। –

उत्तर

4

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

वे चाहिए नहीं, एक ETag और दिए गए संसाधन के लिए Last-Modified हैडर सर्वर दोनों में प्रदान करता है, तो:

HTTP/1.1 ग्राहकों [...] अगर दोनों एक इकाई टैग और मूल सर्वर द्वारा प्रदान किया गया एक अंतिम-संशोधित मान रहा है, कैश-सशर्त अनुरोधों में दोनों मान्यताओं का उपयोग करना चाहिए। यह उचित प्रतिक्रिया देने के लिए HTTP/1.0 और HTTP/1.1 कैश दोनों की अनुमति देता है।

संपादित करें: जब XmlHttpRequest.open() बुला, कार्यान्वयन एक nsIHttpChannel का उपयोग कर एक अनुरोध तैयार करता है, दूसरों If-Modified-Since और If-None-Match हेडर के बीच का उपयोग कर इसे एक स्थानीय कैश्ड आइटम मिल सकता है।

अब जब आप पर If-(Un)Modified-Since या If-None-Match के साथ कॉल करते हैं, तो यह अनुरोध से दोनों शीर्षकों को साफ़ कर देगा और आपका मान निर्धारित करेगा।

+0

सर्वर अंतिम-संशोधित शीर्षलेख प्रदान नहीं करता है। ब्राउज़र को आई-संशोधित-चूंकि हेडर सेट करने का कारण है (वास्तव में, केवल आईई को इसकी आवश्यकता है) आईई के अत्यधिक आक्रामक कैशिंग को रोकने के लिए है। मेरे कोड में मैंने अगर-संशोधित-वर्तमान समय से सेट किया है, और इसके अतिरिक्त मैंने "कैश-कंट्रोल" भी सेट किया है: "अधिकतम आयु = 0"। – Tore

+0

@Tore संपादित देखें। यह एक्सएचआर कार्यान्वयन है जो यह करता है। यदि आप किसी भी संबंधित शीर्षलेख को सेट करके अंतर्निर्मित कैशिंग को ओवरराइड करते हैं, तो यह सेट किए गए सभी कैश हेडर को हटा देता है। – CodeCaster

+0

आपका मतलब setRequestHeader() है, setResponseHeader() नहीं है? – Tore

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