如果您拥有所有网站,包括您的上传服务器和您将上传程序部署到的网站,那么也许一些简单的 DNS 技巧可以帮助您克服困难。
- 假设您的上传服务器域是:
upload.example.com。
- 假设您的服务器是
www.example.com。
在上述情况下,您可以通过设置 document.domain 属性来启用跨站脚本:
document.domain = "example.com";
这允许 www.example.com 与 upload.example.com iframe 进行通信。
假设您拥有这些网站,子域之间的通信能力可以帮助您在其他网络服务器之间进行通信。
如果域不同,你会怎么做?
假设如下:
-
upload.example.com 是您的上传服务器。
-
www.domain.com 是您的网站,它是包含上传者 iframe 的父文档。
现在,我们再次假设您拥有这两个域名,或者至少可以访问设置。使用我们上面了解的关于在子域上启用跨站点脚本的知识,您可以使用一些 DNS 技巧来提供帮助。
- 在您的 DNS 管理器中,为
upload.domain.com 创建一个 CNAME,并将该子域指向与 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 属性和网站。
您可以使用 iframe 中的document.referrer 属性来动态确定父文档的上下文以确定域属性应设置为:
// 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 的方法。