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
.
这是我到目前为止所尝试的:
我无法做任何JavaScript技巧,因为我被同源策略阻止了.
我的想法已经不多了.有谁知道如何阻止浏览器缓存iframed内容?
我安装了Fiddler2,因为Daniel建议再进行一次测试,不幸的是,我仍然得到了相同的结果.
这是我进行的测试:
Math.random()
在JSP中使用随机数生成.通过此测试,我能够确切地看到哪些页面正在更新,以及哪些页面被缓存.
为了快速测试,我加载页面,导航到另一个页面,然后按"返回".结果如下:
原始页面:
离开页面,然后回击:
这表明内部页面正在被缓存,即使外部页面在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)
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
内部窗口发生了变化.
小智 6
要使 iframe 始终加载新内容,请将当前 Unix 时间戳添加到 GET 参数的末尾。然后,浏览器将其视为“不同”请求,并将寻找新内容。
在 Javascript 中,它可能看起来像:
frames['my_iframe'].location.href='load_iframe_content.php?group_ID=' + group_ID + '×tamp=' + timestamp;
Run Code Online (Sandbox Code Playgroud)
如您所说,这里的问题不是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)
(简化版,请注意其他搜索参数)
在尝试了其他所有内容(除了对 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"]
我在 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 缓存问题)。
归档时间: |
|
查看次数: |
87688 次 |
最近记录: |