跨子域的iFrame Javascript

iFrame Javascript Across Subdomain

本文关键字:iFrame Javascript      更新时间:2023-09-26

我知道这是一个重复的问题,但我的要求略有不同,

在之前的一个问题中,这是通过设置来解决的:

document.domain = "yourdomain.com";

在两页上。

然而。。。我有一个www.example.com域名和一个mail.example.com

mail.example.com是一个我无法访问的子域,它是由我的共享主机自动生成的,也是我访问电子邮件的地方。但是,我想要一个以mail.example.com为源的iframe。

例如

// www.example.com/mail.php
<html>
    <head>...</head>
    <body>
       ...
       <? include("header.php"); ?>
       ...
       <iframe src="mail.example.com"></iframe>
       ...
    </body>
</html>

这正如预期的那样工作,但某些样式应用于iframe,所以我想使用javascript删除所有样式,然后添加我自己的样式。

但是因为我没有访问mail.example.com的权限,我无法在子域中设置document.domain = "example.com";

还有别的办法吗?

编辑

我没有把我已经试过的东西说得很清楚。

这是我在www.example.com域mail.php页面中的确切iframe代码:

<iframe id="mail" src="http://mail.a3mediauk.co.uk/mail2/source/index.php" height="800" width="960"></iframe>

这是位于mail.php页面head元素顶部的javascript代码:

document.domain = "http://mail.a3mediauk.co.uk";

这是我试图用来删除样式的jquery代码:

$(function(){
    $("iframe#mail").load(function(){
        $("iframe#mail body").removeAttr("bgcolor");
    });
});

如果有任何帮助的话,document.domain会在chrome控制台中抛出以下错误:

Uncaught Error: SECURITY_ERR: DOM Exception 18

您可能忘记了http://iFrame是客户端(HTML),因此您必须输入绝对路径,因为它是不同的域。您所写的内容将重定向到http://yourdomain.com/mail.yourdomain.com

就同源策略而言,URL必须完全匹配。一个是另一个的子域并不重要;字符串不同,所以您违反了策略。

我看不出一个好的解决方案。如果页面很简单(没有或只有简单的JavaScript,没有链接等),您可以尝试将带有JavaScript的邮件页面提取为字符串,去掉标题(即将body转换为div),然后将其添加到主页面。但当然,这会破坏所有链接,引用人,并导致许多其他问题,比如,如果安装了新版本的邮件界面会发生什么?

另一种解决方案是安装一个代理服务,使mail.domain.com中的所有内容都可用作your.domain.com/mail。如果您在域上运行Apache,那么使用"代理吞吐量"功能的简单重写规则就可以了。