防止浏览器中的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>
var
variables总是改变。 尽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:
- 外部页面使用JSP中的
Math.random()
生成随机数字。 - 外部页面显示网页上的随机数字。
- 外部页面调用iframe,传入随机数。
- 内页显示随机数。
通过这个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中的一个错误。
要使iframe始终加载新内容,请将当前的Unix时间戳添加到GET参数的末尾。 然后浏览器将其视为“不同的”请求,并将寻求新的内容。
在Javascript中,它可能看起来像:
frames['my_iframe'].location.href='load_iframe_content.php?group_ID=' + group_ID + '×tamp=' + 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>