【发布时间】:2011-02-08 12:51:18
【问题描述】:
如何防止 Firefox 和 Safari 缓存 iframe 内容?
我有一个简单的网页,其中包含指向不同网站页面的 iframe。外页和内页都有 HTTP 响应标头以防止缓存。当我在浏览器中单击“返回”按钮时,外部页面可以正常工作,但无论如何,浏览器总是会检索 iframe 页面的缓存。 IE 运行良好,但 Firefox 和 Safari 给我带来了麻烦。
我的网页看起来像这样:
<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
- 向外部网页添加 Expires、Cache-Control 和 Pragma 标头
- 向内部网页添加 Expires、Cache-Control 和 Pragma 标头
我无法使用任何 JavaScript 技巧,因为我被同源策略阻止了。
我的想法已经不多了。有谁知道如何阻止浏览器缓存 iframed 内容?
更新
我按照 Daniel 的建议安装了 Fiddler2 进行另一次测试,不幸的是,我仍然得到相同的结果。
这是我进行的测试:
- 外页在JSP中使用
Math.random()生成随机数。 - 外页在网页上显示一个随机数。
- 外页调用iframe,传入一个随机数。
- 内页显示随机数。
通过这个测试,我可以准确地看到哪些页面正在更新,哪些页面被缓存了。
视觉测试
为了快速测试,我加载页面,导航到另一个页面,然后按“返回”。结果如下:
原始页面:
- 外页: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" />
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 被调用。
嗯,从这个测试来看,网络浏览器似乎没有缓存页面,但它正在缓存 iframe 的 URL,然后对该缓存的 URL 发出新请求。但是,我仍然对如何解决这个问题感到困惑。
有人对如何阻止网络浏览器缓存 iframe URL 有任何想法吗?
【问题讨论】:
-
+1 -- 你的写作很好地捕捉到了痛苦。
-
感谢您对问题的非常详细的解释,这 100% 正是我在网站上遇到的情况。七年过去了,firefox bug report 仍然存在。
-
这能回答你的问题吗? Refresh iFrame (Cache Issue)
标签: browser caching iframe back-button