如果您拥有所有网站,包括您的上传服务器和您将上传程序部署到的网站,那么也许一些简单的 DNS 技巧可以帮助您克服。
- 例如,假设您的上传服务器域是:
upload.example.com
.
- 假设您的服务器是
www.example.com
.
在上述情况下,您可以通过设置 document.domain 属性来启用跨站点脚本:
document.domain = "example.com";
这允许 www.example.com 与 upload.example.com iframe 通信。
假设您拥有这些网站,在子域之间进行通信的能力可以帮助您在其他 Web 服务器之间进行通信。
如果域不同,你会怎么做?
让我们假设以下内容:
upload.example.com
是您的上传服务器。
www.domain.com
是您的网站,它是包含上传者 iframe 的父文档。
现在,我们再次假设您拥有这两个域名,或者至少可以访问设置。使用我们上面了解的关于在子域上启用跨站点脚本的知识,您可以使用一些 DNS 技巧来提供帮助。
- 在您的 DNS 管理器中,为该子域创建一个 CNAME
upload.domain.com
并将其指向与upload.example.com
. 完成后,两者upload.example.com
都upload.domain.com
指向同一个服务器和 PHP 应用程序。
- 在
www.domain.com
,嵌入upload.domain.com
和设置document.domain="domain.com";
- 在
www.example.com
,嵌入upload.example.com
和设置document.domain="example.com";
您可以看到,在这两种情况下,您的网站域名都与上传者域名匹配,并且 document.domain 属性与域匹配。
当您调用 时$('iframe', top.document).css('border', '1px green solid');
,您不会收到任何权限错误。
总之,只要确保无论您在哪个网站中嵌入了上传程序 iframe,您都已为该上传程序创建了与网站域匹配的 CNAME 别名,并且在上传程序和网站中都设置了 document.domain 属性.
您可以使用document.referrer
iframe 中的属性来动态确定父文档的上下文,以确定域属性应设置为:
// uploader file code
// array split by period to get domain ["http://uploader", "example", "com/iframe/uploadFile", "php"]
var domainSplit = document.referrer.split(".");
// the 2nd place in the array is the domain. You may need to improve this for deeper subdomains
document.domain = domainSplit[1];
注意:我假设您使用的是 Apache 和 PHP。如果是这样,您可以为所有upload.XYZ.com
域创建 ServerAlias 条目。如果您使用的是另一台服务器,它们中的大多数都有一些设置 ServerAlias 的方法。