ब्राउज़र में iframe कैशिंग को रोकना


86

आप फ़ायरफ़ॉक्स और सफारी को आइफ्रेम सामग्री को कैशिंग से कैसे रोक सकते हैं?

मेरे पास एक अलग वेब साइट पर एक iframe के साथ एक सरल वेब पेज है। कैशिंग को रोकने के लिए बाहरी पृष्ठ और आंतरिक पृष्ठ दोनों में HTTP प्रतिसाद हेडर है। जब मैं ब्राउज़र में "बैक" बटन पर क्लिक करता हूं, तो बाहरी पृष्ठ ठीक से काम करता है, लेकिन कोई बात नहीं, ब्राउज़र हमेशा iframed पृष्ठ के कैश को पुनर्प्राप्त करता है। IE ठीक काम करता है, लेकिन फ़ायरफ़ॉक्स और सफारी मुझे परेशानी दे रहे हैं।

मेरा वेबपेज कुछ इस तरह दिखता है:

<html>
  <head><!-- stuff --></head>
<body>
  <!-- stuff -->
  <iframe src="webpage2.html?var=xxx" />
  <!-- stuff -->
</body>
</html>

varवैरिएबल हमेशा बदल जाता है। इस तथ्य के बावजूद कि iframe का URL बदल गया है (और इस प्रकार, ब्राउज़र को उस पृष्ठ पर एक नया अनुरोध करना चाहिए), ब्राउज़र केवल कैश्ड सामग्री प्राप्त करता है।

मैंने HTTP अनुरोधों और प्रतिक्रियाओं की जांच आगे-पीछे की है, और मैंने देखा कि भले ही बाहरी पृष्ठ सम्‍मिलित है <iframe src="webpage2.html?var=222" />, ब्राउज़र फिर भी आएगा webpage2.html?var=111

यहाँ मैंने जो अभी तक कोशिश की है:

  • यादृच्छिक URL मान के साथ iframe URL बदलना
  • एक्सपायर, कैश-कंट्रोल और प्रागमा हेडर को बाहरी वेबपेज में जोड़ना
  • एक्सपायर, कैश-कंट्रोल और प्रागमा हेडर को आंतरिक वेबपेज में जोड़ना

मैं कोई जावास्क्रिप्ट चाल करने में असमर्थ हूँ क्योंकि मैं उसी मूल नीति से अवरुद्ध हूँ।

मैं विचारों से भाग रहा हूं। क्या किसी को पता है कि iframed सामग्री को कैशिंग से ब्राउज़र को कैसे रोकें?

अपडेट करें

मैंने Fiddler2 को स्थापित किया क्योंकि डैनियल ने एक और परीक्षण करने का सुझाव दिया, और दुर्भाग्य से, मुझे अभी भी वही परिणाम मिल रहे हैं।

यह परीक्षण मैंने किया है:

  1. बाहरी पेज Math.random()जेएसपी में उपयोग करके यादृच्छिक संख्या उत्पन्न करता है ।
  2. बाहरी पृष्ठ वेबपृष्ठ पर यादृच्छिक संख्या प्रदर्शित करता है।
  3. रैंडम नंबर से गुजरते हुए, आउटर पेज कॉल करता है।
  4. भीतरी पृष्ठ यादृच्छिक संख्या प्रदर्शित करता है।

इस परीक्षण के साथ, मैं ठीक से देख पा रहा हूं कि कौन से पृष्ठ अपडेट हो रहे हैं, और कौन से पृष्ठ कैश हैं।

विजुअल टेस्ट

त्वरित परीक्षण के लिए, मैं पृष्ठ को लोड करता हूं, दूसरे पृष्ठ पर नेविगेट करता हूं, और फिर "वापस" दबाता हूं। यहाँ परिणाम हैं:

मूल पृष्ठ:

  • आउटर पेज: 0.21300034290246206
  • इनर पेज: 0.21300034290246206

पृष्ठ छोड़ना, फिर वापस मारना:

  • बाहरी पृष्ठ: 0.4470929019483644
  • इनर पेज: 0.21300034290246206

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

फिडलर टेस्ट

यकीन है कि काफी, Fiddler एक ही बात की पुष्टि करता है।

(मैं पृष्ठ लोड करता हूं।)

बाहरी पृष्ठ कहा जाता है। HTML:

0.21300034290246206
<iframe src="http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206" />

http: //ipv4.fiddler: 1416 / page1.aspx? var = 0.21300034290246206 कहा जाता है।

(मैं पृष्ठ से दूर नेविगेट करता हूं और फिर वापस हिट करता हूं।)

बाहरी पृष्ठ कहा जाता है। HTML:

0.4470929019483644
<iframe src="http://ipv4.fiddler:1416/page1.aspx?var=0.4470929019483644" />

http: //ipv4.fiddler: 1416 / page1.aspx? var = 0.21300034290246206 कहा जाता है।

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

क्या किसी के पास आइफ्रेम यूआरएल को कैशिंग से वेब ब्राउज़र को रोकने के बारे में कोई विचार है?


11
+1 - आपका लेखन दर्द को इतनी बारीकी से पकड़ता है।
निक नेम

1
समस्या के बहुत विस्तृत विवरण के लिए धन्यवाद, यह 100% है जो मैं एक साइट के साथ अनुभव कर रहा हूं। यह सात साल हो गया है और फ़ायरफ़ॉक्स बग रिपोर्ट अभी भी मौजूद है।
स्कैज़ी

जवाबों:


-3

अपनी साइट के एक पृष्ठ पर iframe का URL बनाएं, जो ifmame की वास्तविक सामग्री को पुनः प्राप्त करने और वापस करने के लिए एक प्रॉक्सी के रूप में कार्य करता है। अब आप एक ही मूल नीति (EDIT: iframe caching समस्या को रोकता नहीं है) से बंधे नहीं हैं।


41
यह कैश को रोकता नहीं है।
baash05

@ baash05 मैंने कभी यह दावा नहीं किया; मैंने कहा कि यह एक ही मूल नीति से बचा जाता है।
6

1
यह सच है .. लेकिन ऑप शीर्षक "ब्राउज़र में iframe कैशिंग को रोकना" पढ़ता है और यदि आपका उत्तर ब्राउज़र में iframe कैशिंग को नहीं रोकता है, तो यह वास्तव में एक उत्तर नहीं है। यह जानना साफ-सुथरा है, लेकिन फिर भी कैशिंग रोकने के लिए किसी की सलाह अच्छी नहीं है।
baash05

ओपी कैशिंग को हल करने और समान-मूल नीति से बचने के लिए देख रहा था । आंशिक उत्तर किसी से बेहतर नहीं है :)
kmoser

2
टोस्ट हमेशा जाम की ओर गिरता है :)
baash05

58

यह फ़ायरफ़ॉक्स में एक बग है:

https://bugzilla.mozilla.org/show_bug.cgi?id=356558

इस समाधान की कोशिश करें:

<iframe src="webpage2.html?var=xxx" id="theframe"></iframe>

<script>
var _theframe = document.getElementById("theframe");
_theframe.contentWindow.location.href = _theframe.src;
</script>

3
आज 27.2.2014 मैं इस धागे को पाकर बहुत खुश हूँ, मुझे लगा कि इसे सर्वर साइड नो-कैशिंग द्वारा हल किया जा सकता है। FF 27 में अभी भी यह बग है।
रॉबर्ट

7
7.8.2014 - 8 साल बाद, और अभी भी तय नहीं हुआ है।
ुकाज़ ज़रोदा

यह srcdoc विशेषता पर भी लागू होता है, इतना अजीब ... इतना महान मैंने यह पाया।
एलुंडमार्क

2
मुझे क्रोम के साथ यही कैशिंग समस्या मिली और जावास्क्रिप्ट की दो पंक्तियों ने इसे हल कर दिया। धन्यवाद!
थोर्न

2
वाह, ठीक यही समस्या थी। फ़ायरफ़ॉक्स के लिए विशिष्ट था - IE, क्रोम, आदि में ठीक काम किया @ धन्यवाद @। विश्वास नहीं कर सकता कि यह इतनी देर तक पड़ा है।
वूडू

32

मैं इस बग के चारों ओर काम करने में सक्षम हो गया है name, आइफ्रेम पर एक अद्वितीय विशेषता सेट करके - जो भी कारण से, यह कैश को तोड़ना लगता है। आपके पास जो भी डायनेमिक डेटा है, उसे आप nameविशेषता के रूप में उपयोग कर सकते हैं - या वर्तमान एमएस या एनएस समय जो भी अस्थायी भाषा आप उपयोग कर रहे हैं। यह ऊपर वालों की तुलना में एक अच्छा समाधान है क्योंकि इसे सीधे जेएस की आवश्यकता नहीं है।

मेरे विशेष मामले में, iframe JS के माध्यम से बनाया जा रहा है (लेकिन आप PHP, Ruby, जो भी हो) के माध्यम से ऐसा कर सकते हैं, इसलिए मैं बस उपयोग करता हूं Date.now():

return '<iframe src="' + src + '" name="' + Date.now() + '" />';

यह मेरे परीक्षण में बग को ठीक करता है; शायद इसलिए कि window.nameभीतर की खिड़की बदलती है।


2
यह उत्तर क्रोम, फ़ायरफ़ॉक्स और सफारी के लिए 2015 के अंत तक काम करता है।
रोवरमिकम्वर

13

जैसा कि आपने कहा, यहाँ मुद्दा iframe कंटेंट कैशिंग नहीं है , बल्कि iframe url caching है

सितंबर 2018 तक, ऐसा लगता है कि यह मुद्दा अभी भी क्रोम में है लेकिन फ़ायरफ़ॉक्स में नहीं है।

मैंने कई चीजों की कोशिश की है (एक बदलते GET पैरामीटर को जोड़ते हुए, onbeforeunload में iframe url को क्लीयर करते हुए, कुकी का उपयोग करके "कैश से पुनः लोड" का पता लगाते हुए, विभिन्न प्रतिक्रिया हेडर सेट करते हुए) और यहाँ केवल दो समाधान हैं, जो मेरे लिए काम कर रहे हैं:

1- आसान तरीका: जावास्क्रिप्ट से अपने आइफ्रेम को गतिशील बनाएं

उदाहरण के लिए:

const iframe = document.createElement('iframe')
iframe.id = ...
...
iframe.src = myIFrameUrl 
document.body.appendChild(iframe)

2- सम्भोग तरीका

सर्वर-साइड, जैसा कि यहां बताया गया है , यदि आप आइफ्रेम या माता-पिता पृष्ठ के लिए सेवा करते हैं (या तो करेंगे) के लिए कंटेंट कैशिंग को अक्षम करें

तथा

इस तरह से एक अतिरिक्त बदलते खोज परम के साथ जावास्क्रिप्ट से iframe url सेट करें:

const url = myIFrameUrl + '?timestamp=' + new Date().getTime()
document.getElementById('my-iframe-id').src = url

(सरलीकृत संस्करण, अन्य खोज परिमों से सावधान रहें)


5

सब कुछ आज़माने के बाद (iframe सामग्री के लिए प्रॉक्सी का उपयोग करने के अलावा), मुझे उसी डोमेन से iframe सामग्री कैशिंग को रोकने का एक तरीका मिला :

.htaccessएक पुनर्लेखन नियम का उपयोग करें और iframe srcविशेषता बदलें ।

RewriteRule test/([0-9]+)/([a-zA-Z0-9]+).html$ /test/index.php?idEntity=$1&token=$2 [QSA]

जिस तरह से मैं इसका उपयोग करता हूं वह यह है कि iframe का URL इस तरह से समाप्त होता है: example.com/test/54/e3116491e90e05700880bf8b269a8cc7.html

जहां [टोकन] एक यादृच्छिक रूप से उत्पन्न मूल्य है। यह URL आइफ्रेम कैशिंग को रोकता है क्योंकि टोकन कभी भी एक जैसा नहीं होता है, और आइफ्रेम को लगता है कि यह एक बिल्कुल अलग वेबपेज है क्योंकि सिंगल रिफ्रेश पूरी तरह से अलग यूआरएल लोड करता है:

example.com/test/54/e3116491e90e05700880bf8b269a8cc7.html
example.com/test/54/d2cc21be7cdcb5a1f989272706de1913.html

दोनों एक ही पृष्ठ पर जाते हैं।

आप अपने छिपे हुए यूआरएल मापदंडों के साथ पहुँच सकते हैं $_SERVER["QUERY_STRING"]


1
मेरे लिए काम किया - धन्यवाद!
क्विन फिनेनी

@QuinnFinney खुशी है कि यह किसी और के लिए उपयोगी था। इस मसले को हल करने में मुझे कुछ दिन लग गए :)
Jeff Noel

हाँ मैं भी! हाहा
क्विन फ़िननी


3

हमेशा ताज़ा सामग्री लोड करने के लिए iframe प्राप्त करने के लिए, GET मापदंडों के अंत में वर्तमान Unix टाइमस्टैम्प जोड़ें। ब्राउज़र तब इसे 'अलग' अनुरोध के रूप में देखता है और नई सामग्री की तलाश करेगा।

जावास्क्रिप्ट में, ऐसा लग सकता है:

frames['my_iframe'].location.href='load_iframe_content.php?group_ID=' + group_ID + '&timestamp=' + timestamp;

3

मुझे नवीनतम Chrome के साथ-साथ Mac OS X पर Mar 17, 2016 के रूप में नवीनतम सफ़ारी में यह समस्या मिली। ऊपर दिए गए किसी भी सुधार ने मेरे लिए काम नहीं किया, जिसमें src को खाली करने और फिर किसी साइट पर वापस भेजने, या में जोड़ना शामिल है कुछ बेतरतीब ढंग से नामित "नाम" पैरामीटर, या हैश के बाद URL के अंत में एक यादृच्छिक संख्या में जोड़ना, या src को असाइन करने के बाद src को सामग्री विंडो href प्रदान करना।

मेरे मामले में, ऐसा इसलिए था क्योंकि मैं IFRAME को अपडेट करने के लिए जावास्क्रिप्ट का उपयोग कर रहा था, और केवल URL में हैश स्विच कर रहा था।

मेरे मामले में वर्कअराउंड यह था कि मैंने एक अंतरिम URL बनाया था जिसमें उस दूसरे पृष्ठ पर 0 सेकंड मेटा रीडायरेक्ट था। यह इतनी तेजी से होता है कि मैं स्क्रीन फ्लैश को शायद ही नोटिस करता हूं। साथ ही, मैंने अंतरिम पृष्ठ की पृष्ठभूमि का रंग अन्य पृष्ठ की तरह ही बनाया है, और इसलिए आप इसे और भी कम नोटिस करते हैं।


2

मैंने अपने ऐप में iframe src विशेषता को बाद में सेट किया है। आवेदन के शुरू में iframe के अंदर कैश्ड सामग्री से छुटकारा पाने के लिए मैं बस यह करता हूं:

myIframe.src = "";

... कहीं js कोड की शुरुआत में (उदाहरण के लिए jquery $ () हैंडलर)

Http://www.freshsupercool.com/2008/07/10/firefox-caching-iframe-data/ के लिए धन्यवाद


0

आईओएस सफारी के साथ 2016 में भी मुझे यह समस्या थी। मेरे लिए जो काम करने के लिए लग रहा था वह iframe src को एक GET- पैरामीटर दे रहा था और इसके लिए एक मूल्य

<iframe width="60%" src="../other/url?cachebust=1" allowfullscreen></iframe>


-1

क्या आपने Fiddler2 स्थापित किया है ?

यह आपको यह देखने देगा कि क्या अनुरोध किया जा रहा है, क्या वापस भेजा जा रहा है, आदि। यह प्रशंसनीय ध्वनि नहीं है कि ब्राउज़र वास्तव में विभिन्न URL के लिए अपने कैश को हिट करेगा।


1
Fiddler2 पर टिप के लिए धन्यवाद। अब मुझे पता है कि ब्राउज़र iframe सामग्री को कैशिंग नहीं कर रहा है; यह केवल iframe URL को कैशिंग कर रहा है। हालाँकि, मैं अभी भी स्तब्ध हूँ, और मुझे नहीं पता कि ब्राउज़र नए पृष्ठ के iframe URL को अनदेखा क्यों करेगा और बस पुराने URL का उपयोग करेगा।
जेआर

-1

यदि आप वास्तव में पागल होना चाहते हैं तो आप पृष्ठ नाम को एक गतिशील यूआरएल के रूप में कार्यान्वित कर सकते हैं जो हमेशा एक ही पृष्ठ पर हल होता है, बजाय क्वेरिस्ट्रिंग विकल्प के?

मान लें कि आप किसी कार्यालय में हैं, तो जांचें कि नेटवर्क स्तर पर कोई कैशिंग चल रही है या नहीं। मेरा विश्वास करो, यह एक संभावना है। आपके आईटी लोग आपको बता पाएंगे कि क्या HTTP कैशिंग के आसपास कोई नेटवर्क इन्फ्रास्ट्रक्चर है, हालांकि चूंकि यह केवल iframe के लिए होता है, यह संभावना नहीं है।


-2

क्या आपने iframe पेज पर नो-कैश के लिए विभिन्न HTTP हैडर विकल्पों को जोड़ने की कोशिश की है?


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