2009-08-05 9 views
10

यह एक अच्छी तरह से ज्ञात समस्या है कि आईई बहुत अधिक HTML को कैश करता है, भले ही Cache-Control: no-cache या Last-Modified प्रत्येक पृष्ठ पर हेडर दे।आईई कैशिंग से बचने के लिए यादृच्छिक क्वेरीस्ट्रिंग

यह behaiviour वास्तव में परेशान जब गतिशील जानकारी पाने के लिए querystrings के साथ काम करने, के रूप में आईई मानता है यह एक ही पृष्ठ हैं (यानी .: http://example.com/?id=10) होने के लिए और कैश किए गए संस्करण में कार्य करता है।

मैंने इसे http://example.com/?id=10&t=2009-08-06_13:12:56 की तरह क्वेरीस्ट्रिंग (as others have done) में यादृच्छिक संख्या या टाइमस्ट्रिंग जोड़ने का हल किया है, जिसे मैं केवल सर्वरसाइड को अनदेखा करता हूं।

वहाँ एक बेहतर विकल्प है? क्या यह एक और साफ करने वाला तरीका है? मुझे पता है कि POST कैश नहीं किया गया है, लेकिन यह GET का उपयोग करने के लिए अर्थात् सही है।

+0

मैं क्या पूछ रहा हूं: क्या ऐसा करने का कोई और तरीका * है? – voyager

+0

आपका दावा गलत है, वैसे भी। आईई "एचटीएमएल का बहुत ज्यादा कैश नहीं करता"। आईई में कैशिंग की चर्चा के लिए www.fiddler2.com/redir/?id=httpperf देखें। – EricLaw

+1

@Eric, IE में कुछ अप्रत्याशित/असंगत [व्यवहार] है (http://support.microsoft.com/kb/222064/) [कैशिंग के संबंध में] (http://support.microsoft.com/kb/234067)। उपरोक्त पोस्ट में सुझाए गए जेनेरिक $ .ajax का उपयोग करके – voyager

उत्तर

2

तो, अंत में, केवल विश्वसनीय तरीका यह (IE6 के लिए धन्यवाद) करने के लिए एक random, या time bound क्वेरी स्ट्रिंग का उपयोग कर रहा है।

आप एक time bound querystring कि केवल प्रत्येक 15 सेकंड (या ऐसी कोई भी राशि) में परिवर्तन इस्तेमाल कर सकते हैं, तो आप सर्वर हिट गिनती कम करना चाहते हैं, के रूप में आप उन 15 सेकंड के लिए स्थानीय रूप से कैश सामग्री देखना चाहते हैं।

आप a standard compliant browser है, तो आप केवल ETags उपयोग करने के साथ प्राप्त कर सकते हैं।

+0

यदि उपयोगकर्ता बैक बटन का उपयोग कर पृष्ठ पर वापस आ जाता है और पृष्ठ पर रीफ्रेश करता है तो यह फिर से विफल हो जाएगा। क्या आप एक निश्चित-शॉट समाधान ढूंढने में सक्षम थे जो सभी मामलों में काम करता है? धन्यवाद। – lostInTransit

+0

आप जावास्क्रिप्ट क्लाइंटसाइड के साथ क्वेरीस्ट्रिंग का "यादृच्छिक" भाग जेनरेट करते हैं जैसे http://stackoverflow.com/questions/1234246/random-querystring-to-avoid-ie-caching/1234260#1234260 इस तरह, यह होगा अलग * हर बार * 'get' या' post' किया जाता है। – voyager

+0

"... (आईई 6 के लिए धन्यवाद) है ..." आईई 7 के लिए धन्यवाद, मैंने अभी तक आईई 8 का परीक्षण नहीं किया। –

0

मैं एक ही समस्या है, लेकिन ध्यान रखना, एक सेकंड में वहाँ कई अनुरोधों हो सकता है।

$.getJSON("http://server/example?param=value&dummy=" + Math.random(), ...); 
+0

का उपयोग किये बिना समस्या को हल करने में मदद मिली, ठीक है, मैं ** एक ही ग्राहक ** नहीं चाहता मेरे सर्वर को मारना ** प्रति सेकंड कई टाइमर **, इसलिए मुझे कोई फर्क नहीं पड़ता कि दिखाए गए जानकारी 1 सेकंड पुरानी है। बेशक, उत्पादन मनुष्यों के लिए सादा पाठ है। – voyager

2

क्वेरी स्ट्रिंग पर एक यादृच्छिक संख्या (नहीं टाइमस्टैम्प) का उपयोग करना, या वास्तव में फ़ाइल नाम को बदलने की सिफारिश की दो विधियाँ हैं: यही कारण है कि मैं इस का उपयोग करें। स्टीव Souders और YAHOO!'s performance group उपयोगी जानकारी और प्रथाओं उन्हें पता चला और विकसित किया है, जबकि दुनिया के सबसे भारी-दौरा संपत्ति में से एक के अनुकूलन के एक टन प्रकाशित किया है।

6

तुम भी मिलीसेकेंड में वर्तमान यूनिक्स समय इस्तेमाल कर सकते हैं एक सेकंड में कई अनुरोधों की समस्या से बचने के (यह बहुत कम एक मिलीसेकंड में एक से अधिक अनुरोध होने की संभावना है)

var url = "http://whatever.com/stuff?key=value&ie=" + (new Date()).getTime(); 
0

आप एक जोड़ने की कोशिश की है प्रतिक्रिया में ETag शीर्षलेख? आप एक यादृच्छिक एक, या जेनरेट पेज के चेकसम का उपयोग कर सकते हैं ताकि कैश किए गए संस्करण को उचित होने पर सेवा दी जा सके।

मुझे यकीन है कि IE के व्यवहार है, लेकिन हाल के संस्करण के साथ काम करना चाहिए क्या नहीं कर रहा हूँ।

भी देखें HTTP RFC section on ETag

11

मान लिया जाये कि आप jQuery का उपयोग कर रहे हैं, बजाय $ .Get या $ का उपयोग कर .getJson की, अधिक सामान्य $ .ajax का उपयोग करें और स्पष्ट रूप से गलत पर कैश मान सेट करें।निम्नलिखित एक उदाहरण है:

$.ajax({ 
     url: "/Controller/Action", 
     cache: false, 
     type: "GET", 
     dataType: "json", 
     success: function(data, textStatus) { 
         alert("success"); 
       } 
    }); 

एक छोटे से अधिक कोड (हालांकि ज्यादा नहीं) .getJson का उपयोग कर या .Get लेकिन यादृच्छिक संख्या जोड़कर बिना सफाई से समस्या का समाधान होगा की तुलना में की आवश्यकता है।

+0

मुझे यह पता चला है कि आईई में जीईटी अनुरोध का उपयोग करके हमें एचटीएमएल को कैश करने के लिए सेट नहीं करना चाहिए और मैंने 'कैश: झूठा' सेट किया है और इससे आईई को कैश से परिणाम लाने से रोक दिया गया है। धन्यवाद – Lucky

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