好的,我有一个页面在这个页面上有一个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时,我一直得到相同的访问拒绝错误。因此,即使子域也可以算作跨站脚本,这是正确的,还是我做错了什么?


当前回答

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

var currentUrl = document.referrer;

这里有主url!

其他回答

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

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

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

这个问题有很多答案,但在支持或可靠性方面,没有一个肯定是最好的。

选项

window.location.ancestorOrigins[0] will get the parent url, but this api only works in chromium browsers (see support). this also supports nested iframes, where the bottom most child has access to the urls of each parent iframe. document.referrer is the most common answer but is not always reliable navigation inside of the iframe would show the last page instead of the parent frame url redirects only show the most recent referrer to the current page if the page reloads itself the referer becomes the page itself http child with an https parent has an empty string for referrer

不管用的东西

window.parent.location.href。如果父节点和子节点在不同的域中,这个api会被现代浏览器阻塞(见这里),并抛出一个错误。

建议

如果支持,我更喜欢window.location.祖宗起源[0]。文档。推荐器可以工作,但不太可靠,使其成为我的备用选项。如果您确实使用文档引用器,请尝试在第一次加载框架页面时调用它,然后再进行导航或重定向,以获取父地址。

试一试:

document.referrer

当你在iframe中更改时,你的主机是“referrer”。

对于同一域和不同子域上的页面,可以设置文档。通过javascript的域属性。

父帧和iframe都需要设置它们的文档。域是指它们之间共有的东西。

即。 www.foo.mydomain.com和api.foo.mydomain.com都可以使用foo.mydomain.com或只使用mydomain.com,并且是兼容的(不,出于安全原因,你不能将它们都设置为com…)

另外,请注意文档。领域是一条单行道。考虑按顺序运行以下三条语句:

// 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