好的,我有一个页面在这个页面上有一个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 URL是

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

当我试图从pageB.html (iframe页面)抓取URL时,我一直得到相同的访问拒绝错误。因此,即使子域也可以算作跨站脚本,这是正确的,还是我做错了什么?


当前回答

PHP $_SERVER['HTTP_REFFERER']的问题是它给出了将您带到父页面的页面的完全限定页面url。这和父页面本身不一样。更糟糕的是,有时没有http_referer,因为用户输入了父页面的url。如果我从yahoo.com到你的父页面,yahoo.com就变成http_referer,而不是你的页面。

其他回答

是的,如果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导致“Blocked a frame with origin…”

文档。referrer指的是“链接到该页的页面的URI”。如果其他源决定了iframe的位置,则可能不会返回包含的文档,例如:

容器iframe @域1 将子iframe发送到Domain 2 但是在子iframe中。域2重定向到域3(即用于身份验证,可能是SAML),然后域3定向回域2(即通过表单提交(),一种标准的SAML技术) 对于子文件iframe。引用者将是Domain 3,而不是包含的Domain 1

文档。location指的是“一个location对象,它包含关于文档URL的信息”;假定是当前的文档,即当前打开的iframe。当窗口。Location === window.parent。位置,那么iframe的href与包含父元素的href相同。

我在这方面有问题。如果使用像php这样的语言,当你的页面第一次载入iframe时,抓取$_SERVER[' http_refererer ']并将其设置为一个会话变量。

这样,当页面在iframe中加载时,您就知道加载它的页面的完整父url和查询字符串。对于跨浏览器的安全性,依赖于窗口有点让人头疼。如果你有不同的域名,父级任何东西。

我刚刚发现了一个解决这个问题的简单方法,但我还没有发现任何地方提到它的讨论。它需要控制父帧。

在你的iFrame中,假设你想要这样的iFrame: src="http://www.example.com/mypage.php"

好吧,而不是HTML来指定iframe,使用javascript来为你的iframe构建HTML,通过javascript“在构建时”获得父url,并将其作为url get参数在你的src目标的查询字符串中发送,如下所示:

<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

你是正确的。当使用iframe时,子域仍然被认为是单独的域。可以使用postMessage(…)传递消息,但其他JS api被故意设置为不可访问。

还可以根据上下文获取URL。详见其他答案。

如果你的iframe来自另一个域(跨域),你只需要使用这个:

var currentUrl = document.referrer;

这里有主url!