2008-09-30 87 views
23

对于在带有多个参数的表单中发布AJAX表单,我正在使用创建iframe的解决方案,通过POST将表单发布到该表单,然后访问iframe的内容。 具体而言,我访问这样的内容:访问iframe文档对象时出现“访问被拒绝”错误

$("some_iframe_id").get(0).contentWindow.document 

我测试了它和它的工作。

在某些页面上,我开始出现“Access is denied”错误。据我所知,如果iframe是从同一个域提供的,就不会发生这种情况。

我很确定它以前工作。任何人都有线索?

如果我不够清楚:我发布到相同的域。所以这不是一个跨域请求。我只在IE上测试。

P.S.我不能使用简单的ajax POST查询(不要问...)

回答

48

自己解决!

问题是,即使发送了正确的响应(用Fiddler验证),它也是使用HTTP 500错误代码(而不是200)发送的。

因此,事实证明,如果响应是使用错误代码发送的,则IE将用从磁盘加载的错误消息(res://ieframe.dll/http_500.htm)替换iframe的内容,并导致跨域访问被拒绝错误。

+0

我使用fileupload.js上传文件(它使用iframe)。看起来像我有同样的问题,但我不知道什么可能会导致此。看起来只是超时问题。你是怎么阻止的? – 2010-02-23 15:45:09

+0

我不确定我是否理解这个问题。无论如何,如果你认为它与我的解决方案有关,你应该看看上传的响应返回的HTTP代码。 – Ovesh 2010-03-10 08:27:15

-1

基本上,当框架中的文档和ii以外的文档具有不同的域时,会发生此错误。所以为了防止跨脚本的浏览器禁用这种执行。

+2

我发布到相同的域。 – Ovesh 2008-09-30 01:11:33

-1

,如果它是一个域的问题(或子域),如www.foo.com发送的每一页上www.api.foo.com

的请求可以设置

document.domain = www.foo.com 

允许“跨域”权限

5

跨域错误,当涉及到的iFrame:

  1. 开放的iFrame与不同的URL(例如开放www.foo.com)从父母页面(www.ooof。COM)

  2. 不同的端口(开口的iframe网址为:从原始端口)不同

  3. 不同的协议:从作为HTTP

检查父页开口的iFrame与HTTPS URL那些如果你遇到这个问题。

2

我的问题是X-Frame-Options HTTP标头。我的Apache配置已将它设置为:

Header always append X-Frame-Options DENY 

删除它允许它工作。具体来说,在我来说,我是用IFRAME运输的jQuery与jQuery的文件上传插件上传IE 9和IE 10

1

说明文件,如果你有src='javascript:void(0)'然后一个iframe中的JavaScript像frame.document.location =...将失败,并在访问被拒绝错误IE浏览器。正在使用与目标框架交互的JavaScript库。即使它试图改变框架的位置与父代位于同一个域中,但iframe最初设置为javascript:void,从而触发了跨域访问被拒绝的错误。

为了解决这个问题,我在我的网站上创建了一个blank.html页面,如果我需要事先声明一个iframe,直到通过javascript更改,然后我将它指向空白页以便src='/content/blank.html'处于同一个域名。

或者,您可以完全通过JavaScript创建iframe,以便您可以在创建时设置src,但在我的情况下,我使用的库需要已在页面上声明的iframe。