【问题标题】:"Access is denied" error on accessing iframe document object访问 iframe 文档对象时出现“访问被拒绝”错误
【发布时间】:2008-09-30 00:56:00
【问题描述】:

为了在具有许多参数的表单中发布 AJAX 表单,我使用的解决方案是创建一个 iframe,通过 POST 将表单发布到它,然后访问 iframe 的内容。 具体来说,我正在访问这样的内容:

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

我测试了它并且它有效。

在某些页面上,我开始收到“访问被拒绝”错误。据我所知,如果 iframe 来自同一个域,则不应该发生这种情况。

我很确定它以前工作过。有人有线索吗?

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

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

【问题讨论】:

    标签: javascript ajax iframe


    【解决方案1】:

    自己解决了!

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

    事实证明,如果发送带有错误代码的响应,IE 会将 iframe 的内容替换为从磁盘加载的错误消息 (res://ieframe.dll/http_500.htm),从而导致跨域访问拒绝错误。

    【讨论】:

    • 我正在使用 fileupload.js 上传文件(它使用 iframe)。看起来我有同样的问题,但我不确定是什么原因造成的。看起来只是超时问题。你是如何防止这种情况发生的?
    • 我不确定我是否理解这个问题。无论如何,如果您认为它与我的解决方案有关,您应该查看上传响应返回的 HTTP 代码。
    • 谢谢。就我而言,如果上传的文件包含错误(一些验证),我将返回 400 Bad Request。它导致“访问被拒绝”错误。
    • 此文件替换是由“友好错误消息”功能引起的并且您的响应低于 512 字节。详情在这里:stackoverflow.com/questions/11769962/…
    【解决方案2】:

    注意与 iFrames 相关的安全限制,例如 跨域 限制(又名 CORS)。以下是与 CORS 相关的 3 个常见错误:

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

    2. 使用不同的端口加载 iFrame:iFrame 的 URL port 与顶部框架的 URL 不同。

    3. 不同的协议:通过 HTTPS 加载 iFrame 资源,而父 Frame 使用 HTTP。

    【讨论】:

      【解决方案3】:

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

      Header always append X-Frame-Options DENY
      

      删除它允许它工作。特别是在我的情况下,我使用 jQuery 的 iframe 传输和 jQuery 文件上传插件来上传 IE 9 和 IE 10 中的文件。

      【讨论】:

      • 我在我的环境中遇到了同样的问题。将 X-Frame-Options 设置为 SAMEORIGIN 为我解决了这个问题
      【解决方案4】:

      我知道这个问题很老,但我想提一下,上面的答案对我有用:将 document.domain 设置为每个页面上的相同 - 父页面和 iframe 页面。然而在我的搜索中,我确实找到了这篇有趣的文章:

      http://softwareas.com/cross-domain-communication-with-iframes

      【讨论】:

        【解决方案5】:

        请注意,如果您有一个带有 src='javascript:void(0)' 的 iframe,那么像 frame.document.location =... 这样的 javascript 将在 IE 中出现访问被拒绝错误而失败。正在使用与目标框架交互的 javascript 库。即使它试图将框架更改为的位置与父级位于同一域中,但 iframe 最初设置为 javascript:void 触发了跨域访问被拒绝错误。

        为了解决这个问题,我在我的站点中创建了一个空白.html 页面,如果我需要提前声明一个 iframe,该 iframe 在通过 javascript 更改之前最初是空白的,然后我将它指向空白页面,以便 src='/content/blank.html' 是在同一个域中。

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 我发布到同一个域。
          【解决方案7】:

          如果是域问题(或子域),例如 www.foo.com 向 www.api.foo.com 发送请求

          你可以在每个页面上设置

          document.domain = www.foo.com
          

          允许“跨域”权限

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-25
            • 2014-07-07
            • 2012-02-21
            • 1970-01-01
            • 2014-06-23
            • 1970-01-01
            • 2020-07-09
            • 1970-01-01
            相关资源
            最近更新 更多