好的,我有一个页面在这个页面上有一个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时,我一直得到相同的访问拒绝错误。因此,即使子域也可以算作跨站脚本,这是正确的,还是我做错了什么?
这个问题有很多答案,但在支持或可靠性方面,没有一个肯定是最好的。
选项
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]。文档。推荐器可以工作,但不太可靠,使其成为我的备用选项。如果您确实使用文档引用器,请尝试在第一次加载框架页面时调用它,然后再进行导航或重定向,以获取父地址。
对于同一域和不同子域上的页面,可以设置文档。通过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