Tarayıcıda iframe önbelleğe almayı önleme


88

Firefox ve Safari'nin iframe içeriğini önbelleğe almasını nasıl engellersiniz?

Farklı bir sitedeki bir sayfaya iç çerçeve içeren basit bir web sayfam var. Hem dış sayfada hem de iç sayfada, önbelleğe almayı önlemek için HTTP yanıt başlıkları bulunur. Tarayıcıdaki "geri" düğmesini tıkladığımda, dış sayfa düzgün çalışıyor, ancak ne olursa olsun, tarayıcı her zaman iç çerçeveli sayfanın önbelleğini alıyor. IE gayet iyi çalışıyor, ancak Firefox ve Safari bana sorun çıkarıyor.

Web sayfam şuna benzer:

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

varDeğişken her zaman değişir. İframe'in URL'sinin değişmesine rağmen (ve dolayısıyla tarayıcının o sayfaya yeni bir istekte bulunması gerekir), tarayıcı sadece önbelleğe alınmış içeriği getirir.

İleri geri HTTP isteklerini ve yanıtlarını inceledim ve dış sayfa içerse bile <iframe src="webpage2.html?var=222" />tarayıcının getirmeye devam edeceğini fark ettim webpage2.html?var=111.

Şimdiye kadar denediklerim şunlar:

  • İframe URL'sini rastgele değişken değeriyle değiştirme
  • Dış web sayfasına Expires, Cache-Control ve Pragma üstbilgileri ekleme
  • Expires, Cache-Control ve Pragma üstbilgilerini iç web sayfasına ekleme

Aynı kökenli politika tarafından engellendiğim için herhangi bir JavaScript numarası yapamıyorum.

Fikirler tükeniyor. Tarayıcının iç çerçeveli içeriği önbelleğe almasını nasıl durduracağını bilen var mı?

Güncelleme

Daniel'in önerdiği gibi Fiddler2'yi kurdum ve maalesef hala aynı sonuçları alıyorum.

Yaptığım test bu:

  1. Dış sayfa Math.random(), JSP'de kullanarak rastgele sayı üretir .
  2. Dış sayfa web sayfasında rastgele sayı gösterir.
  3. Dış sayfa, rasgele sayı ileten iframe'i çağırır.
  4. İç sayfa rastgele sayı görüntüler.

Bu test ile tam olarak hangi sayfaların güncellendiğini ve hangi sayfaların önbelleğe alındığını görebiliyorum.

Görsel Test

Hızlı bir test için sayfayı yüklüyorum, başka bir sayfaya gidiyorum ve ardından "geri" düğmesine basıyorum. Sonuçlar burada:

Orijinal Sayfa:

  • Dış Sayfa: 0.21300034290246206
  • İç Sayfa: 0.21300034290246206

Sayfadan çıkıp geri dönme:

  • Dış sayfa: 0,4470929019483644
  • İç sayfa: 0.21300034290246206

Bu, dış sayfanın URL'de farklı bir GET parametresiyle çağırmasına rağmen iç sayfanın önbelleğe alındığını gösterir. Bazı nedenlerden dolayı, tarayıcı, iframe'in yeni bir URL talep ettiği gerçeğini görmezden geliyor; sadece eskisini yükler.

Fiddler Testi

Elbette, Fiddler aynı şeyi onaylıyor.

(Sayfayı yüklerim.)

Dış sayfaya denir. HTML:

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

http: //ipv4.fiddler: 1416 / page1.aspx? var = 0.21300034290246206 çağrılır.

(Sayfadan uzaklaşıyorum ve sonra geri dönüyorum.)

Dış sayfaya denir. HTML:

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

http: //ipv4.fiddler: 1416 / page1.aspx? var = 0.21300034290246206 çağrılır.

Pekala, bu testten, web tarayıcısı sayfayı önbelleğe almıyor gibi görünüyor, ancak iç çerçevenin URL'sini önbelleğe alıyor ve ardından önbelleğe alınan URL için yeni bir istekte bulunuyor. Ancak, bu sorunun nasıl çözüleceği konusunda hala şaşkınım.

Web tarayıcısının iframe URL'lerini önbelleğe almasını nasıl durduracağına dair herhangi bir fikri olan var mı?


11
+1 - Yazınız acıyı çok güzel yakalar.
nickf

1
Sorunun çok ayrıntılı açıklaması için teşekkür ederim, bu tam olarak bir sitede yaşadığım şey% 100. Yedi yıl oldu ve firefox hata raporu hala mevcut.
Scuzzy

Yanıtlar:


-3

İframe URL'sinin, sitenizdeki gerçek iframe içeriğini almak ve döndürmek için bir proxy görevi gören bir sayfayı işaret etmesini sağlayın. Artık aynı kaynak politikasına bağlı değilsiniz (DÜZENLE: iframe önbelleğe alma sorununu engellemez).


41
bu önbelleği engellemez.
baash05

@ baash05 Yaptığını iddia etmedim; Aynı menşe politikasından kaçınıyor dedim.
kmoser

1
Doğru .. ancak op başlığı "Tarayıcıda iframe önbelleğe alınmasını engelliyor" yazıyor ve cevabınız tarayıcıda iframe önbelleğe almayı engellemiyorsa, bu gerçekten bir cevap değil. Bilmek güzel, ancak önbelleğe almayı önlemek isteyen biri için yine de iyi bir tavsiye değil.
baash05

OP, önbelleğe almayı çözmek ve aynı kaynaklı politikadan kaçınmak istiyordu . Kısmi bir cevap hiç
yoktan

2
tost her zaman reçel tarafı aşağı düşer :)
baash05

59

Bu, Firefox'taki bir hatadır:

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

Bu geçici çözümü deneyin:

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

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

3
Bugün 27.2.2014 Bu konuyu bulduğum için çok mutluyum, sunucu tarafında önbelleğe alma olmadan çözülebileceğini düşündüm. FF 27'de hala bu hata var.
Robert

7
7.8.2014 - 8 yıl sonra ve hala sabit değil.
Łukasz Zaroda

Bu aynı zamanda srcdoc niteliği için de geçerlidir, çok garip ... Bunu çok büyük buldum.
elundmark

2
Aynı önbelleğe alma sorununu Chrome'da buldum ve iki satır JavaScript sorunu çözdü. Teşekkür ederim!
Thorn

2
Vay canına, aynı sorunu yaşadım. Firefox'a özeldi - IE, Chrome, vb. İçin iyi çalıştı. Teşekkürler @caleb. Bunun bu kadar uzun sürdüğüne inanamıyorum.
Voodoo

33

İframe'de benzersiz bir nameöznitelik ayarlayarak bu hatayı aşabildim - her ne sebeple olursa olsun, bu önbelleği bozuyor gibi görünüyor. nameÖznitelik olarak sahip olduğunuz dinamik verileri veya kullandığınız şablonlama dilindeki mevcut ms veya ns zamanını kullanabilirsiniz. Bu, yukarıdakilerden daha hoş bir çözümdür çünkü doğrudan JS gerektirmez.

Benim özel durumumda, iframe JS aracılığıyla oluşturuluyor (ancak aynısını PHP, Ruby vb. İle de yapabilirsiniz), bu yüzden basitçe kullanıyorum Date.now():

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

Bu, testimdeki hatayı düzeltir; muhtemelen window.nameiç pencerede değiştiği için.


2
Bu yanıt, 2015'in sonlarından itibaren Chrome, Firefox ve Safari için geçerlidir.
rovermicrover

13

Sizin de söylediğiniz gibi, buradaki sorun iframe içeriğini önbelleğe alma değil , iframe url önbelleğe alma .

Eylül 2018 itibarıyla, sorunun hala Chrome'da gerçekleştiği, ancak Firefox'ta olmadığı görülüyor.

Pek çok şey denedim (değişen bir GET parametresi eklemek, onbeforeunload'daki iframe url'sini temizlemek, bir çerez kullanarak "önbellekten yeniden yükleme" algılamak, çeşitli yanıt başlıkları ayarlamak) ve işte benden işe yarayan iki çözüm:

1- Kolay yol: iframe'inizi dinamik olarak javascript'ten oluşturun

Örneğin:

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

2- Katlı yol

Sunucu tarafında, burada açıklandığı gibi , iframe VEYA üst sayfa için sunduğunuz içerik için içeriği önbelleğe almayı devre dışı bırakın (her ikisi de olur).

VE

Javascript iframe url'sini ek bir değişen arama parametresiyle ayarlayın, örneğin:

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

(basitleştirilmiş sürüm, diğer arama parametrelerine dikkat edin)


5

Diğer her şeyi denedikten sonra (iframe içeriği için bir proxy kullanmak dışında), aynı etki alanından iframe içeriğini önbelleğe almanın bir yolunu buldum :

.htaccessBir yeniden yazma kuralı kullanın ve iframe srcözelliğini değiştirin .

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

Bunu kullanma şeklim, iframe'in URL'sinin şu şekilde görünmesidir: example.com/test/54/e3116491e90e05700880bf8b269a8cc7.html

Burada [belirteç] rastgele oluşturulmuş bir değerdir. Bu URL, jeton hiçbir zaman aynı olmadığından iframe önbelleğe almayı engeller ve tek bir yenileme tamamen farklı bir URL yüklediği için iframe bunun tamamen farklı bir web sayfası olduğunu düşünür:

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

her ikisi de aynı sayfaya götürür.

Gizli url parametrelerinize şununla erişebilirsiniz: $_SERVER["QUERY_STRING"]


1
Benim için çalıştı - Teşekkürler!
Quinn Finney

@QuinnFinney Bu başka biri için yararlı oldu. Bu sorunu çözmem birkaç
Jeff Noel

Evet ben de! hahaha
Quinn Finney


3

İframe'in her zaman yeni içerik yüklemesini sağlamak için geçerli Unix zaman damgasını GET parametrelerinin sonuna ekleyin. Tarayıcı daha sonra bunu 'farklı' bir istek olarak görür ve yeni içerik arayacaktır.

Javascript'te şöyle görünebilir:

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

3

Bu sorunu en son Chrome'da ve 17 Mart 2016 itibarıyla Mac OS X'teki en son Safari'de buldum. Yukarıdaki düzeltmelerden hiçbiri benim için işe yaramadı, src'yi boş olarak atama ve ardından bir siteye geri ekleme veya ekleme rastgele adlandırılmış bir "ad" parametresi veya hash'den sonra URL'nin sonuna rastgele bir sayı ekleme veya src'yi atadıktan sonra içerik penceresi href'i src'ye atama.

Benim durumumda bunun nedeni, IFRAME'i güncellemek için Javascript kullanıyor olmam ve yalnızca URL'deki hash'i değiştirmemdi.

Benim durumumdaki geçici çözüm, diğer sayfaya 0 saniyelik bir meta yönlendirmesi olan bir ara URL oluşturmamdı. O kadar hızlı oluyor ki, ekran flaşının neredeyse hiç farkına varmıyorum. Artı, ara sayfanın arka plan rengini diğer sayfayla aynı yaptım ve böylece daha az fark edeceksiniz.



0

2016 yılında iOS Safari ile de bu sorunu yaşadım. Benim için işe yarayan şey, iframe src'ye bir GET parametresi ve bunun gibi bir değer vermekti

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


-1

Yüklediğiniz Fiddler2 ?

Tam olarak neyin talep edildiğini, neyin geri gönderildiğini vb. Görmenizi sağlar. Tarayıcının farklı URL'ler için önbelleğini gerçekten vurması mantıklı gelmiyor.


1
Fiddler2 ile ilgili ipucu için teşekkürler. Artık tarayıcının iframe içeriğini önbelleğe almadığını biliyorum; sadece iframe URL'sini önbelleğe almaktır. Bununla birlikte, hala kafam karıştı ve tarayıcının neden yeni sayfanın iframe URL'sini yoksayacağı ve sadece eski URL'yi kullanacağı konusunda hiçbir fikrim yok.
JR.

-1

Eğer almak istiyorsanız gerçekten deli her zaman yerine querystring seçeneği yerine, aynı sayfaya gideren dinamik url olarak sayfa adını uygulamak olabilir?

Bir ofiste olduğunuzu varsayarak, ağ seviyesinde herhangi bir önbelleğe alma olup olmadığını kontrol edin. İnan bana, bu bir olasılık. BT ekibiniz, HTTP önbelleğe alma etrafında herhangi bir ağ altyapısı olup olmadığını size söyleyebilir, ancak bu yalnızca iframe için olası değildir.


-2

İframe sayfasına önbellek içermeyen çeşitli HTTP Üstbilgi seçeneklerini eklemeyi denediniz mi?


Evet. Her sayfadaki hem HTTP başlıklarında hem de meta etiketlerinde önbellek içermeyen yönergeleri denedim.
JR.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.