“访问被拒绝”访问iframe文档对象时出错
-
02-07-2019 - |
题
为了在包含许多参数的表单中发布AJAX表单,我使用创建 iframe
的解决方案,通过POST将表单发布到它,然后访问 iframe
的内容。
具体来说,我正在访问这样的内容:
$("some_iframe_id").get(0).contentWindow.document
我测试了它并且它起作用了。
在某些页面上,我开始收到“访问被拒绝”字样。错误。据我所知,如果iframe是从同一个域提供的,那么这不应该发生。
我很确定它之前有效。有人有线索吗?
如果我不够清楚:我要发布到同一个域。所以这不是跨域请求。我只在IE上测试。
P.S。我不能使用简单的ajax POST查询(不要问...)
解决方案
自己解决了!
问题是,即使正在发送正确的响应(通过Fiddler验证),也会发送一个HTTP 500错误代码(而不是200)。
事实证明,如果发送带有错误代码的响应,IE将使用从磁盘加载的错误消息替换 iframe
的内容( res:// ieframe .dll / http_500.htm
),这会导致跨域访问被拒绝错误。
其他提示
请注意与 iFrame 相关的安全限制,例如跨域限制(又称CORS)。以下是与CORS相关的3个常见错误:
-
加载具有不同域的iFrame。 (例如:打开“ www.foo.com ”,而顶部框架为“ www.ooof.com ”)
-
使用其他端口加载iFrame:iFrame的网址端口与顶部框架不同。
-
不同的协议:通过HTTPS加载iFrame资源,而父框架使用HTTP。
醇>
我的问题是 X-Frame-Options
HTTP标头。我的Apache配置将其设置为:
Header always append X-Frame-Options DENY
删除它允许它工作。特别是在我的情况下,我使用iframe传输jQuery和jQuery文件上传插件来上传IE 9和IE 10中的文件。
我知道这个问题已经过时了,但我想提一下上面的答案对我有用:在每个页面上设置document.domain是相同的 - 父页面和iframe页面。但是在我的搜索中,我找到了这篇有趣的文章:
http://softwareas.com/cross-domain-communication-with-iframes
请注意,如果你有一个带有 src ='javascript:void(0)'
的iframe,那么像 frame.document.location = ...
这样的javascript会因Access而失败在IE中拒绝错误。使用的是与目标框架交互的JavaScript库。即使它尝试将帧更改为与父级在同一域中的位置,iframe最初也设置为javascript:void,这会触发跨域访问被拒绝错误。
为了解决这个问题,我在我的网站上创建了一个blank.html页面,如果我需要事先声明一个iframe,最初将是空白的,直到通过javascript更改,然后我将其指向空白页面,以便 src ='/ content / blank.html'
位于同一个域中。
或者你可以通过javascript完全创建iframe,这样你就可以在创建时设置src,但在我的情况下,我使用了一个库,它需要在页面上声明iframe。
基本上,当框架内和ii外部的文档具有不同的域时,会发生此错误。因此,为防止跨端脚本浏览器禁用此类执行。
如果是域名问题(或子域名),例如www.foo.com向www.api.foo.com发送请求
在每个页面上您可以设置
document.domain = www.foo.com
允许“跨域”权限