防止在浏览器中使用iframe缓存

JR.*_*JR. 76 browser iframe caching back-button

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

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

我的网页看起来像这样:

<html>
  <head><!-- stuff --></head>
<body>
  <!-- stuff -->
  <iframe src="webpage2.html?var=xxx" />
  <!-- stuff -->
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

var变量总是变化.尽管iframe的URL已更改(因此,浏览器应该向该页面发出新请求),但浏览器只是获取缓存的内容.

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

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

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

我无法做任何JavaScript技巧,因为我被同源策略阻止了.

我的想法已经不多了.有谁知道如何阻止浏览器缓存iframed内容?

更新

我安装了Fiddler2,因为Daniel建议再进行一次测试,不幸的是,我仍然得到了相同的结果.

这是我进行的测试:

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

通过此测试,我能够确切地看到哪些页面正在更新,以及哪些页面被缓存.

视觉测试

为了快速测试,我加载页面,导航到另一个页面,然后按"返回".结果如下:

原始页面:

  • 外页:0.21300034290246206
  • 内页:0.21300034290246206

离开页面,然后回击:

  • 外页:0.4470929019483644
  • 内页:0.21300034290246206

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

提琴手测试

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

(我加载页面.)

外页被调用.HTML:

0.21300034290246206
<iframe src="http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206" />
Run Code Online (Sandbox Code Playgroud)

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

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

外页被调用.HTML:

0.4470929019483644
<iframe src="http://ipv4.fiddler:1416/page1.aspx?var=0.4470929019483644" />
Run Code Online (Sandbox Code Playgroud)

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

好吧,从这个测试中,看起来好像Web浏览器没有缓存页面,但它正在缓存iframe的URL,然后在该缓存的URL上发出新请求.但是,我仍然难以理解如何解决这个问题.

有没有人对如何阻止Web浏览器缓存iframe URL有任何想法?

Cal*_*leb 47

这是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>
Run Code Online (Sandbox Code Playgroud)

  • 7.8.2014 - 8年后,仍然没有修复. (6认同)
  • 今天27.2.2014我很高兴找到这个帖子,我认为它可以通过服务器端无缓存来解决.FF 27仍然有这个bug. (3认同)
  • 我发现Chrome存在同样的缓存问题,两行JavaScript解决了这个问题.谢谢! (2认同)
  • 哇,有完全相同的问题.特定于Firefox - 在IE,Chrome等中运行良好.感谢@caleb.不敢相信这已经徘徊了这么久. (2认同)

STR*_*RML 29

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

在我的特定情况下,iframe是通过JS构建的(但你也可以通过PHP,Ruby等做同样的事情),所以我只是使用Date.now():

return '<iframe src="' + src + '" name="' + Date.now() + '" />';
Run Code Online (Sandbox Code Playgroud)

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

  • 你我的朋友,你是我的救星。我一直以为这是我的代码。多谢。我的+1。 (4认同)
  • 此答案适用于Chrome,Firefox和Safari,截至2015年底. (2认同)

小智 6

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

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

frames['my_iframe'].location.href='load_iframe_content.php?group_ID=' + group_ID + '&timestamp=' + timestamp;
Run Code Online (Sandbox Code Playgroud)


ste*_*643 6

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

截至2018年9月,似乎该问题仍在Chrome中出现,但在Firefox中未出现。

我尝试了很多事情(添加更改的GET参数,清除onbeforeunload中的iframe网址,使用Cookie检测“从缓存中重新加载”,设置各种响应标头),这是我唯一有效的两种解决方案:

1-简单的方法:从javascript动态创建iframe

例如:

const iframe = document.createElement('iframe')
iframe.id = ...
...
iframe.src = myIFrameUrl 
document.body.appendChild(iframe)
Run Code Online (Sandbox Code Playgroud)

2-卷积方式

服务器端,如解释在这里,禁用内容缓存为您服务为iframe的内容父页面(或者也可以)。

设置来自javascript的iframe网址以及其他更改的搜索参数,如下所示:

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

(简化版,请注意其他搜索参数)


Jef*_*oel 5

在尝试了其他所有内容(除了对 iframe 内容使用代理外)之后,我找到了一种防止 iframe 内容缓存的方法,来自同一个域

使用.htaccess和重写规则并更改 iframesrc属性。

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 参数 $_SERVER["QUERY_STRING"]


Vol*_*ike 5

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

就我而言,这是因为我使用 Javascript 来更新 IFRAME,并且只切换 URL 中的哈希值。

我的案例的解决方法是创建一个临时 URL,其中包含 0 秒元重定向到该其他页面。它发生得太快了,我几乎没有注意到屏幕闪烁。另外,我将临时页面的背景颜色设置为与其他页面相同,因此您更不会注意到它。


kmo*_*ser -4

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

  • 这不会阻止缓存。 (45认同)
  • 吐司总是果酱面朝下掉:) (2认同)