Javascript 从iframe访问父URL
好的,我有一页,在这一页我有一个iframe。我需要做的是在iframe页面上,找出主页的URL是什么 我到处搜索过,我知道如果我的iframe页面位于不同的域上,这是不可能的,因为这是跨站点脚本。但我所读到的所有地方都说,如果iframe页面与父页面位于同一个域中,那么它应该可以工作,例如:Javascript 从iframe访问父URL,javascript,iframe,cross-domain,Javascript,Iframe,Cross Domain,好的,我有一页,在这一页我有一个iframe。我需要做的是在iframe页面上,找出主页的URL是什么 我到处搜索过,我知道如果我的iframe页面位于不同的域上,这是不可能的,因为这是跨站点脚本。但我所读到的所有地方都说,如果iframe页面与父页面位于同一个域中,那么它应该可以工作,例如: parent.document.location 。。。或者其他类似的组合,因为似乎有多种方法可以获得相同的信息 总之,问题出在这里。我的iframe与主页在同一个域中,但它不在同一个子域中。比如说我有
parent.document.location
。。。或者其他类似的组合,因为似乎有多种方法可以获得相同的信息
总之,问题出在这里。我的iframe与主页在同一个域中,但它不在同一个子域中。比如说我有
http://www.mysite.com/pageA.html
然后我的iframe URL是
http://qa-www.mysite.com/pageB.html
当我试图从
pageB.html
(iframe页面)中获取URL时,我总是收到相同的访问拒绝错误。因此,即使是子域也被视为跨站点脚本,这是正确的,还是我做错了什么?你是正确的。在使用iframe时,子域仍然被视为单独的域。可以使用来传递消息,但是其他JSAPI被故意设置为不可访问
还可以根据上下文获取URL。有关更多详细信息,请参阅其他答案。对于相同域和不同子域上的页面,您可以通过javascript设置
document.domain
属性
父框架和iframe都需要将其document.domain设置为它们之间的共同点
i、 e。
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中不起作用。
我刚刚发现了一个非常简单的解决这个问题的方法,但我还没有找到任何提到这个问题的讨论。它确实需要控制父帧 在iFrame中,假设您想要这个iFrame:src=”http://www.example.com/mypage.php" 好的,不用HTML来指定iframe,而是使用javascript为您的iframe构建HTML,在“构建时”通过javascript获取父url,并将其作为src目标的查询字符串中的url get参数发送,如下所示:
<script type="text/javascript">
url = parent.document.URL;
document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>
url=parent.document.url;
文件。写(“”);
然后,找到一个javascript url解析函数,该函数解析url字符串以获取您要查找的url变量,在本例中是“url”
我在这里找到了一个很棒的url字符串解析器:
我无法使用以前的解决方案,但我发现如果我使用例如
http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder
设置iframe scr,那么我可以在iframe extractthisdomain.com/thisfolder
中使用以下javascript:
var myString = document.location.toString();
var mySplitResult = myString.split("=");
fromString = mySplitResult[1];
是,如果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
导致“使用原点阻止帧…”
引用“链接到此页面的页面的URI”。如果某个其他源决定了iframe
位置,则这可能不会返回包含的文档,例如:
- 容器iframe@Domain 1
- 将子iframe发送到域2
- 但是在孩子的身体里。。。域2重定向到域3(即用于身份验证,可能是SAML),然后域3重定向回域2(即通过表单提交(),一种标准SAML技术)
- 对于子iframe,
文档。referer
将是域3,而不是包含域1
指“一个位置对象,其中包含有关文档URL的信息”;大概是当前的文档,即当前打开的iframe。当window.location===window.parent.location
时,iframe的href
与包含父对象的href
相同,我对此有问题。如果在iframe抓取$\u服务器['HTTP\u REFFERER']
中首次加载页面时使用类似php的语言,并将其设置为会话变量
这样,当页面加载到iframe中时,您就知道加载它的页面的完整父url和查询字符串。使用跨浏览器安全性时,依赖window.parent(如果您使用的是不同的域,则任何内容都可以)是一件令人头疼的事情。PHP$\u服务器['HTTP\u REFFERER']的问题在于,它提供了将您带到父页面的页面的完全限定页面url。这与父页面本身不同。更糟糕的是,有时没有http_referer,因为用户键入了父页面的url。因此,如果我从yahoo.com访问您的父页面,那么yahoo.com将成为http\u referer,而不是您的页面。我发现,$\u服务器['http\u referer']
不起作用(我在看您,Safari),$\u服务器['REDIRECT\u SCRIPT\u URI']
是一个有用的备份。如果您的iframe来自另一个域,(跨域),您只需使用以下功能:
var currentUrl = document.referrer;
还有-这里是主url
var url = (window.location != window.parent.location) ? document.referrer: document.location;
我发现前面提到的示例在iframe中执行脚本时起作用,但是它没有起作用
在iframe之外执行脚本时检索url,
A.
var url = (window.location != window.parent.location)
? document.referrer
: document.location.href;
var currentUrl = document.referrer;
var url = (window.location != window.parent.location) ? document.referrer: document.location;
var url = (window.location != window.parent.location) ? document.referrer: document.location.href;
window.document.URL
var parent = $(window.frameElement).parent();
//alert(parent+"TESTING");
var parentElement=window.frameElement.parentElement.parentElement.parentElement.parentElement;
var Ifram=parentElement.children;
var GetUframClass=Ifram[9].ownerDocument.activeElement.className;
var Decision_URLLl=parentElement.ownerDocument.activeElement.contentDocument.URL;
document.referrer
private getParentOrigin() {
const locationAreDisctint = (window.location !== window.parent.location);
const parentOrigin = ((locationAreDisctint ? document.referrer : document.location) || "").toString();
if (parentOrigin) {
return new URL(parentOrigin).origin;
}
const currentLocation = document.location;
if (currentLocation.ancestorOrigins && currentLocation.ancestorOrigins.length) {
return currentLocation.ancestorOrigins[0];
}
return "";
}