从iframe访问父url

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

我周围search,我知道这是不可能的,如果我的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时,子域名仍被视为独立的域名。 使用postMessage(...)传递消息是可能的,但其他的JS API是故意无法访问的。

依然可以根据上下文获取URL。 请参阅其他答案了解更多详情。

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

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

我正在努力解决同样的问题,并从其他来源获得解决scheme。 为我工作。

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

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

那么,而不是HTML来指定iframe,使用javascript来为您的iframe构buildHTML,通过JavaScript“在构build时”获得父url,并将其作为URL GET参数发送到您的src目标的查询string,就像所以:

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

然后,find自己的javascript urlparsing函数,parsingurlstring以获取您之后的urlvariables,在这种情况下,它是“url”。

我在这里find了一个很棒的urlstringparsing器: http : //www.netlobo.com/url_query_string_javascript.html

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

 var currentUrl = document.referrer; 

和 – 这里你有主要的url!

对于同一个域和不同子域的页面,可以通过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

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

我发现上面的示例build议以前的工作是在iframe中执行脚本时执行的,但是当脚本在iframe之外执行时,没有检索到url,需要稍作调整:

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

我有这个问题。 如果在页面首次加载iframe时使用类似php的语言,请抓住$_SERVER['HTTP_REFFERER']并将其设置为会话variables。

这种方式,当页面加载在iframe中,你知道加载它的页面的完整的父url和查询string。 对于跨浏览器的安全性,如果你使用不同的域名,那么在window.parent任何东西上都会有点头痛的问题。

我不能得到以前的解决scheme的工作,但我发现,如果我设置iframe scr与例如http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder那么我可以,在iframe中提取thisdomain.com/thisfolder使用以下javascript:

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

PHP $ _SERVER ['HTTP_REFFERER']的问题在于,它给出了将页面带到父页面的完全限定页面url。 这不同于父页面本身。 更糟糕的是,有时候没有http_referer,因为人们在父页面的url中input。 所以,如果我从yahoo.com到达您的父页面,那么yahoo.com将成为http_referer,而不是您的页面。

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

这工作对我来说,访问iframe srcurl。

 window.document.URL