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