Browser 防止浏览器中的iframe缓存

Browser 防止浏览器中的iframe缓存,browser,caching,iframe,back-button,Browser,Caching,Iframe,Back Button,如何防止Firefox和Safari缓存iframe内容 我有一个简单的网页,在不同的网站上有一个iframe。外部页面和内部页面都有HTTP响应头,以防止缓存。当我在浏览器中单击“后退”按钮时,外部页面工作正常,但无论如何,浏览器总是检索iframed页面的缓存。IE运行得很好,但Firefox和Safari给我带来了麻烦 我的网页看起来像这样: <html> <head><!-- stuff --></head> <body>

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

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

我的网页看起来像这样:

<html>
  <head><!-- stuff --></head>
<body>
  <!-- stuff -->
  <iframe src="webpage2.html?var=xxx" />
  <!-- stuff -->
</body>
</html>
const url = myIFrameUrl + '?timestamp=' + new Date().getTime()
document.getElementById('my-iframe-id').src = url
被称为

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

外部页面被称为。HTML:

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

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

有人知道如何阻止web浏览器缓存iframe URL吗?

您安装了吗


它可以让您准确地看到所请求的内容、返回的内容等。如果浏览器真的会在缓存中找到不同的URL,这听起来并不合理。

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

您是否尝试过向iframe页面添加各种用于无缓存的HTTP头选项?

如果您真的想变得疯狂,您可以将页面名称实现为始终解析到同一页面的动态url,而不是查询字符串选项


假设您在办公室,检查网络级别是否正在进行缓存。相信我,这是可能的。您的IT人员将能够告诉您HTTP缓存周围是否有任何网络基础设施,尽管这只发生在iframe上,不太可能发生。

这是Firefox中的一个错误:

尝试以下解决方法:

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

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

var_theframe=document.getElementById(“theframe”);
_theframe.contentWindow.location.href=\u theframe.src;

这是Firefox 3.5中的一个bug

看一看。。

我稍后在我的应用程序中设置iframe src属性。要在应用程序开始时除去iframe中的缓存内容,我只需执行以下操作:

myIframe.src = "";
。。。js代码开头的某个地方(例如在jquery$()处理程序中)

多亏了

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

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

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

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

在我的特殊情况下,iframe是通过JS构建的(但您也可以通过PHP、Ruby等进行构建),因此我只需使用
Date.now()

返回“”;

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

在尝试了所有其他操作(除了使用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

其中,[token]是随机生成的值。此URL阻止iframe缓存,因为令牌从来都不相同,而且iframe认为它是一个完全不同的网页,因为一次刷新加载一个完全不同的URL:

example.com/test/54/e3116491e90e05700880bf8b269a8cc7.html

example.com/test/54/d2cc21be7cdcb5a1f989272706de1913.html

两者都指向同一页


您可以使用

访问隐藏的url参数。截至2016年3月17日,我在最新的Chrome浏览器以及Mac OS X上的最新Safari中发现了这个问题。上面的修复对我来说都不起作用,包括将src分配为empty然后返回到某个站点,或者添加一些随机命名的“name”参数,或者在散列后的URL末尾添加随机数,或者在分配src后将内容窗口href分配给src

在我的例子中,这是因为我使用Javascript更新IFRAME,并且只切换URL中的哈希


在我的例子中,解决方法是我创建了一个临时URL,该URL有一个0秒的元重定向到另一个页面。它发生得如此之快,以至于我几乎没有注意到屏幕上的闪光。另外,我将临时页面的背景颜色与另一个页面相同,因此您注意到的更少。

2016年iOS Safari也出现了这个问题。似乎对我有用的是 向iframe src提供一个GET参数和一个值,如下所示


正如您所说,这里的问题不是iframe内容缓存,而是iframe url缓存

截至2018年9月,这个问题似乎仍然出现在Chrome上,而不是Firefox上

我尝试了很多方法(添加一个更改的GET参数,在onbeforeunload中清除iframe url,使用cookie检测“从缓存重新加载”,设置各种响应头),以下是我仅有的两个解决方案:

1-简单方法:创建您的ifra
const iframe = document.createElement('iframe')
iframe.id = ...
...
iframe.src = myIFrameUrl 
document.body.appendChild(iframe)
const url = myIFrameUrl + '?timestamp=' + new Date().getTime()
document.getElementById('my-iframe-id').src = url