从iframe访问父网址

时间:2010-08-05 23:41:18

标签: javascript iframe cross-domain

好的,我在这个页面上有一个页面我有一个iframe。我需要做的是在iframe页面上,找出主页面的URL是什么。

我一直在搜索,我知道如果我的iframe页面位于不同的域上,这是不可能的,因为这是跨站点脚本。但我读到的所有地方都说,如果iframe页面与父页面在同一个域中,那么如果我这样做,它应该可以工作:

parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href

......或其他类似的组合,因为似乎有多种方法可以获得相同的信息。

无论如何,这就是问题所在。我的iframe与主页面位于同一个域中,但它不在同一个SUB域中。所以例如我有

  

http:// www.mysite.com/pageA.html

然后我的iframe网址是

  

http:// qa-www.mysite.com/pageB.html

当我尝试从pageB.html(iframe页面)抓取网址时,我一直收到相同的访问被拒绝错误。所以看起来甚至子域都算作跨站点脚本,这是正确的,还是我做错了什么?

18 个答案:

答案 0 :(得分:314)

是的,如果iframe和主页不在同一(子)域中,则不允许访问父页面的URL。但是,如果您只需要主页的URL(即浏览器URL),则可以尝试:

var url = (window.location != window.parent.location)
            ? document.referrer
            : document.location.href;

注意:

允许

window.parent.location;它避免了OP中的安全性错误,这是由访问href属性引起的:window.parent.location.href导致“阻止带有原始的框架......”

document.referrer指的是“链接到此页面的页面的URI”。如果某个其他来源确定了iframe位置,那么可能会返回包含文档,例如:

  • Container iframe @ Domain 1
  • 将子iframe发送到域2
  • 但是在子iframe中...域2重定向到域3(即用于身份验证,可能是SAML),然后域3将返回到域2(即通过表单提交(),标准的SAML技术)
  • 对于子iframe,document.referrer将是域 3 ,而不是包含域 1

document.location指的是“一个位置对象,其中包含有关文档URL的信息”;可能是当前文档,即iframe当前打开。在window.location === window.parent.location时,iframe的href相同与包含父级的href

答案 1 :(得分:45)

我刚刚发现这个问题的解决方法非常简单,但我还没有找到任何提及它的讨论。它确实需要控制父框架。

在你的iFrame中,假设你想要这个iframe:src =“http://www.example.com/mypage.php”

好吧,用HTML来指定iframe,使用javascript为iframe构建HTML,通过javascript“在构建时”获取父url,并将其作为url GET参数发送到src的querystring中目标,如:

<script type="text/javascript">
  url = parent.document.URL;
  document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>

然后,找到一个javascript url解析函数,解析url字符串以获取你所追求的url变量,在这种情况下它是“url”。

我在这里找到了一个很棒的url字符串解析器: http://www.netlobo.com/url_query_string_javascript.html

答案 2 :(得分:28)

如果您的iframe来自其他域(跨域),则只需使用此命令:

var currentUrl = document.referrer;

和 - 这里你有主要的网址!

答案 3 :(得分:19)

你是对的。使用iframe时,子域仍被视为单独的域。可以使用postMessage(...)传递消息,但有意使其他JS API无法访问。

根据上下文,仍然可以获取URL。有关详细信息,请参阅其他答案。

答案 4 :(得分:16)

对于同一域和不同子域的网页,您可以通过javascript设置document.domain属性。

父框架和iframe都需要将其document.domain设置为它们之间通用的内容。

即。 出于安全原因,www.foo.mydomain.comapi.foo.mydomain.com可以分别使用foo.mydomain.com或仅mydomain.com并兼容(不,您不能将它们都设置为com ...)

另外,请注意document.domain是一条单行道。请考虑按顺序运行以下三个语句:

// assume we're starting at www.foo.mydomain.com
document.domain = "foo.mydomain.com" // works
document.domain = "mydomain.com" // works
document.domain = "foo.mydomain.com" // throws a security exception

现代浏览器也可以使用window.postMessage来交换原点,但它在IE6中不起作用。 https://developer.mozilla.org/en/DOM/window.postMessage

答案 5 :(得分:6)

以下行将起作用:document.location.ancestorOrigins[0],这将返回祖先域名。

答案 6 :(得分:2)

var url = (window.location != window.parent.location) ? document.referrer: document.location;

我发现上面的示例建议以前在iframe中执行脚本时有效,但事实并非如此 在iframe外部执行脚本时检索url, 需要稍作调整:

var url = (window.location != window.parent.location) ? document.referrer: document.location.href;

答案 7 :(得分:2)

我遇到了这个问题。如果您的网页首次加载到iframe抓取$_SERVER['HTTP_REFFERER']并将其设置为会话变量时使用像php这样的语言。

这样,当页面在iframe中加载时,您就知道加载它的页面的完整父URL和查询字符串。使用跨浏览器安全性,如果您使用不同的域,那么依靠window.parent会有点令人头痛。

答案 8 :(得分:1)

我发现在$_SERVER['HTTP_REFERER']不起作用的情况下(我在看你,Safari),$_SERVER['REDIRECT_SCRIPT_URI']是一个有用的备份。

答案 9 :(得分:1)

PHP $ _SERVER ['HTTP_REFFERER']的问题在于它提供了将您带到父页面的页面的完全限定页面URL。这与父页面本身不同。更糟糕的是,有时候没有http_referer,因为这个人输入了父页面的url。所以,如果我从yahoo.com到你的父页面,那么yahoo.com就会成为http_referer,而不是你的页面。

答案 10 :(得分:1)

我无法获得以前的解决方案,但我发现如果我使用例如http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder设置iframe src,那么我可以通过使用以下javascript在iframe提取thisdomain.com/thisfolder中添加: / p>

var myString = document.location.toString();
var mySplitResult = myString.split("=");
fromString = mySplitResult[1];

答案 11 :(得分:1)

尝试一下:

document.referrer

更改后,您在iframe中的主机就是“引荐来源网址”。

答案 12 :(得分:0)

在Chrome中可以使用location.ancestorOrigins 它将返回所有父网址

答案 13 :(得分:0)

我知道他已经超龄了,但是我很惊讶,没有人建议仅将Cookie从一个域传递到另一个域。在使用子域时,只需将cookie设置为url .basedomain.com

,即可将基本域的cookie共享给所有子域。

然后,您可以通过cookie共享所需的任何数据。

答案 14 :(得分:0)

有一个用于获取父源的跨浏览器脚本:

private getParentOrigin() {
  const locationAreDisctint = (window.location !== window.parent.location);
  const parentOrigin = ((locationAreDisctint ? document.referrer : document.location) || "").toString();

  if (parentOrigin) {
    return new URL(parentOrigin).origin;
  }

  const currentLocation = document.location;

  if (currentLocation.ancestorOrigins && currentLocation.ancestorOrigins.length) {
    return currentLocation.ancestorOrigins[0];
  }

  return "";
}

此代码应该适用于 Chrome 和 Firefox。

答案 15 :(得分:-1)

我可以访问iframe src网址。

window.document.URL

答案 16 :(得分:-1)

就我而言,document.location.href 已经足够了。

答案 17 :(得分:-4)

获取所有父iframe功能和HTML

var parent = $(window.frameElement).parent();
        //alert(parent+"TESTING");
        var parentElement=window.frameElement.parentElement.parentElement.parentElement.parentElement;
        var Ifram=parentElement.children;      
        var GetUframClass=Ifram[9].ownerDocument.activeElement.className;
        var Decision_URLLl=parentElement.ownerDocument.activeElement.contentDocument.URL;