首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >阻止浏览器中的iframe缓存

阻止浏览器中的iframe缓存
EN

Stack Overflow用户
提问于 2010-04-16 02:40:11
回答 13查看 115.6K关注 1票数 97

如何防止Firefox和Safari缓存iframe内容?

我有一个简单的网页与iframe到一个不同的网站上的页面。外部页面和内部页面都有HTTP响应头,以防止缓存。当我在浏览器中单击"back“按钮时,外部页面可以正常工作,但无论如何,浏览器始终会检索iframed页面的缓存。IE运行得很好,但是Firefox和Safari给我带来了麻烦。

我的网页看起来像这样:

代码语言:javascript
复制
<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

这是我到目前为止尝试过的:

  • 使用随机变量值更改iframe URL
  • 将过期、缓存控制和Pragma标头添加到外部网页
  • 将过期、缓存控制和Pragma标头添加到内部网页

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

我的想法快用完了。有人知道如何阻止浏览器缓存iframed内容吗?

更新

我按照丹尼尔的建议安装了Fiddler2来执行另一个测试,不幸的是,我仍然得到相同的结果。

这是我执行的测试:

  1. 外部页在JSP中使用Math.random()生成随机数。
  2. 外部页在

页上显示随机数调用iframe,传入随机number.

  1. Inner页显示随机数。

通过这项测试,我能够准确地看到哪些页面正在更新,哪些页面被缓存。

视觉测试

为了快速测试,我加载页面,导航到另一个页面,然后按“back”。结果如下:

原始页面:

  • 外部页: 0.21300034290246206
  • Inner页: 0.21300034290246206

离开页面,然后回击:

0.4470929019483644

  • Inner页面: 0.21300034290246206

  • 外部页面

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

Fiddler测试

果然,Fiddler证实了同样的事情。

(我加载页面。)

外部页面被调用。HTML:

代码语言:javascript
复制
0.21300034290246206
<iframe src="http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206" />

调用http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206

(我离开页面,然后点击返回。)

外部页面被调用。HTML:

代码语言:javascript
复制
0.4470929019483644
<iframe src="http://ipv4.fiddler:1416/page1.aspx?var=0.4470929019483644" />

调用http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206

从这个测试中,看起来web浏览器似乎没有缓存页面,但它缓存了iframe的URL,然后在缓存的URL上发出新的请求。然而,对于如何解决这个问题,我仍然感到困惑。

有没有人有关于如何阻止web浏览器缓存iframe URL的想法?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2010-06-30 00:50:00

使iframe的URL指向站点上的一个页面,该页面充当检索和返回iframe实际内容的代理。现在您不再受同源策略的约束(EDIT:不会阻止iframe缓存问题)。

票数 -4
EN

Stack Overflow用户

发布于 2010-10-21 11:30:11

这是Firefox中的一个错误:

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

尝试此解决方法:

代码语言:javascript
复制
<iframe src="webpage2.html?var=xxx" id="theframe"></iframe>

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

Stack Overflow用户

发布于 2014-10-04 16:47:29

我已经能够通过在iframe上设置一个唯一的name属性来解决这个错误-无论出于什么原因,这似乎会破坏缓存。您可以使用您拥有的任何动态数据作为name属性-或者使用您正在使用的任何模板语言简单地使用当前ms或ns时间。这是一个比上面的解决方案更好的解决方案,因为它不直接需要JS。

在我的特殊情况下,iframe是通过JS构建的(但您也可以通过PHP、Ruby或其他任何方式实现相同的功能),所以我只使用Date.now()

代码语言:javascript
复制
return '<iframe src="' + src + '" name="' + Date.now() + '" />';

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

票数 39
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2648053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档