为了在包含许多参数的表单中发布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个常见错误:

  1. 加载具有不同域的iFrame。 (例如:打开“ www.foo.com ”,而顶部框架为“ www.ooof.com ”)

  2. 使用其他端口加载iFrame:iFrame的网址端口与顶部框架不同。

  3. 不同的协议:通过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

允许“跨域”权限

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top