从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.com
和api.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