防止浏览器中的iframecaching

如何防止Firefox和Safaricachingiframe内容?

我有一个简单的网页与一个iframe到不同的网站页面。 外部页面和内部页面都有HTTP响应头,以防止caching。 当我单击浏览器中的“返回”button时,外部页面正常工作,但无论如何,浏览器总是检索iframed页面的caching。 IE浏览器工作得很好,但Firefox和Safari都给我带来麻烦。

我的网页看起来像这样:

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

varvariables总是改变。 尽pipeiframe的URL已经发生变化(因此,浏览器应该向该页面发出新的请求),但浏览器只是获取caching的内容。

我已经检查了HTTP请求和响应,我注意到,即使外部页面包含<iframe src="webpage2.html?var=222" /> ,浏览器仍然会获取webpage2.html?var=111

以下是我迄今为止所尝试的:

  • 用随机var值更改iframe URL
  • 将Expires,Cache-Control和Pragma标题添加到外部网页
  • 将Expires,Cache-Control和Pragma标题添加到内部网页

我无法执行任何JavaScript技巧,因为我被同源策略阻止。

我正在用尽想法。 有谁知道如何停止浏览器cachingiframed内容?

更新

我安装Fiddler2丹尼尔build议执行另一个testing,不幸的是,我仍然得到相同的结果。

这是我进行的testing:

  1. 外部页面使用JSP中的Math.random()生成随机数字。
  2. 外部页面显示网页上的随机数字。
  3. 外部页面调用iframe,传入随机数。
  4. 内页显示随机数。

通过这个testing,我可以看到哪些页面正在更新,哪些页面被caching。

视觉testing

对于快速testing,我加载页面,导航到另一个页面,然后按“返回”。 结果如下:

原始页面:

  • 外页面:0.21300034290246206
  • 内页:0.21300034290246206

离开页面,然后点击:

  • 外页面:0.4470929019483644
  • 内页:0.21300034290246206

这表明正在caching内部页面,即使外部页面在URL中使用不同的GET参数调用它。 出于某种原因,浏览器忽略了iframe正在请求新URL的事实; 它只是加载旧的。

提琴手testing

果然,提琴手确认了同样的事情。

(我加载页面。)

外部页面被调用。 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被调用。

那么,从这个testing看起来好像Web浏览器并没有caching页面,而是caching了iframe的URL,然后在caching的URL上发出一个新的请求。 但是,我仍然不知道如何解决这个问题。

有没有人有任何想法如何停止从cachingiframe的url的网页浏览器?

将iframe的URL指向您网站上的一个页面,该页面充当代理来检索并返回iframe的实际内容。 现在你不再受同源政策的约束。

这是Firefox中的一个错误:

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> 

我已经能够通过在iframe上设置一个唯一的name属性来解决这个bug了 – 无论出于何种原因,这似乎破坏了caching。 您可以使用您拥有的任何dynamic数据作为name属性 – 或者使用您使用的任何模板语言中的当前ms或ns时间。 这是比上述更好的解决scheme,因为它不直接要求JS。

在我的特殊情况下,iframe是通过JS构build的(但是你可以通过PHP,Ruby,不pipe),所以我只是使用Date.now()

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

这修复了我testing中的错误; 可能是因为内部窗口中的window.name发生了变化。

这是Firefox 3.5中的一个错误。

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

要使iframe始终加载新内容,请将当前的Unix时间戳添加到GET参数的末尾。 然后浏览器将其视为“不同的”请求,并将寻求新的内容。

在Javascript中,它可能看起来像:

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

稍后在我的应用程序中设置iframe src属性。 要在应用程序的开始处摆脱iframe中的caching内容,我只需要:

 myIframe.src = ""; 

…在js代码的开始(例如在jquery $()处理程序中)

感谢http://www.freshsupercool.com/2008/07/10/firefox-caching-iframe-data/

在尝试了其他所有内容(除了使用iframe内容的代理外)之后,我发现了一种防止来自同一个域的 iframe内容caching的方法:

使用.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

其中[token]是随机生成的值。 这个URL可以防止iframecaching,因为这个标记永远不会相同,iframe会认为这是一个完全不同的网页,因为一次刷新会加载一个完全不同的URL:

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

都导致相同的页面。

您可以使用$_SERVER["QUERY_STRING"]访问隐藏的url参数

我在2016年3月17日发现了最新的Chrome浏览器以及Mac OS X上的最新版本的Safari浏览器。上述修复程序都不适用于我,包括将src分配为空,然后返回某个网站,或者添加一些随机命名的“name”参数,或者在散列之后的URL末尾添加一个随机数字,或者在分配src之后将内容窗口href分配给src。

在我的情况下,这是因为我正在使用JavaScript来更新IFRAME,并只在URL中切换哈希。

在我的情况下解决方法是,我创build了一个临时的URL有0秒元redirect到其他页面。 它发生得太快,我几乎没有注意到屏幕闪光。 另外,我将中间页面的背景颜色与其他页面的颜色相同,因此您会注意到更less。

你安装了Fiddler2吗?

它会让你看到究竟是什么被请求,什么是被送回等等。这听起来似乎不合理的浏览器将真正打击其caching不同的url。

您是否尝试过将no-cache的各种HTTP Header选项添加到iframe页面?

如果你想变得非常疯狂,你可以实现页面名称作为一个dynamic的url,总是parsing为相同的页面,而不是querystring选项?

假设你在办公室,检查是否有任何networking级别的caching。 相信我,这是可能的。 您的IT人员将能够告诉您是否有围绕HTTPcaching的任何networking基础架构,但是由于这只发生在iframe上,所以不太可能。

我在iOS 2016也遇到了这个问题。 什么似乎为我工作是一个GET参数的iframe src和值这样的

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