"拒绝访问"在同一域上的IE9中的contentDocument上

时间:2014-07-21 19:26:23

标签: javascript internet-explorer internet-explorer-9 fine-uploader

短/通用版:

我正在处理一个应用程序(不幸的是,出于其他原因),将每个页面顶部的document.domain设置为" true"的子字符串。域:适用于sub.app.localdocument.domain = "app.local"等子域。我还动态创建iframe并将其添加到页面中。 iframe加载与父页面位于同一服务器上的文件。稍后,某些Javascript需要访问iframe的contentDocument属性。

这在现代浏览器中很好用,但由于this bug导致IE9出现问题。 (请参阅top answer以获得有关其原因的详细说明。)AFAIK,每个比IE9更新的浏览器会自动继承document.domain以用于以编程方式创建的iframe,因此这是IE9特定的。由于我的场景的一些独特要求(tldr:iframe src需要更改),上面的帖子中的答案对我来说并不起作用。

更长/特定于应用程序的版本:

我在IIS上运行的应用程序中使用FineUploader,将文件上传到S3。在现代浏览器中,一切都运行良好,但即使在遵循文档(Supporting IE9 and older)配置iframeSupport.localBlankPagePath选项后,IE9支持也给我带来了麻烦。我有点难过!

  • 我在FineUploader 4.0.3和5.0.3上尝试了这个。
  • 在IE11中一切正常。如果我在F12控制台中将文档模式切换为9,则会中断。
  • 我没有启用CORS支持,因为我没有从其他域加载任何内容。
  • 我的页面与同一个域中有一个虚拟/空白文件。
  • 我可以看到(在“网络”面板中)来自AWS的HTTP 303响应,其中包含Location键,以及指向空白文档的值。如果我将整个网址粘贴到地址栏中,则网页会正常加载并且按预期显示为空白。
  • 我已尝试按照建议hereX-Frame-Options SAMEORIGIN添加到服务器的响应标头中,但它没有帮助。

我在控制台中收到的错误是:

[Fine Uploader 5.0.3] Error when attempting to access iframe during handling of upload response (Access is denied.
)
[Fine Uploader 5.0.3] Amazon likely rejected the upload request



更新

我已经确定它不是开箱即用的原因是因为应用程序在页面加载时设置了document.domain,它与(a)不同({1}}的子集。 FineUploader的303重定向机制到空白页面工作正常,但iframe的location.host与父级不同(由于IE9没有继承该属性),因此拒绝访问。

实际的S3上传是正常工作。它只是验证上传失败的最后一步。

这是我的客户端代码:

FineUploader.js

document.domain

2 个答案:

答案 0 :(得分:2)

(如果有人在Fi​​neUploader的上下文之外发现这个答案,this idea就是我的解决方案。)

为了实现这一点,我让FineUploader的blank.html略显空白:

<head>
<script type="text/javascript">
    // Provide a mechanism to override document.domain
    // inside the iframe via this url syntax: blank.html?[args]#domain.com
    if (location.hash.substring(1).length > 0)
        document.domain = location.hash.substring(1);
</script>
</head><body></body>

这为我提供了一种在生成iframe时从父页面提供正确的document.domain值的方法。对FineUploader配置对象进行轻微修改:

$.fineUploaderS3({
[snip]
    iframeSupport: {
        localBlankPagePath: App.BaseUrl + "/Scripts/FineUploader/4.0.3/html/blank.html#" + document.domain
    },
[/snip]
}

这似乎不会干扰AWS前面的参数。我们仍然在这个应用程序中使用FineUploader 4.0.3,但这也适用于最新版本。

tl,dr; 它有效!在IE11文档模式和本机IE9中测试。

答案 1 :(得分:1)

该错误表明iframe提供的页面确实与托管上传者的页面不同。要么是这样,要么你有一些插件/扩展导致麻烦。根据错误,Fine Uploader根本无法访问iframe中的任何内容,这种情况发生在iframe的域与托管上传者的框架/网页的域不匹配时。