Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从iframe访问父URL_Javascript_Iframe_Cross Domain - Fatal编程技术网

Javascript 从iframe访问父URL

Javascript 从iframe访问父URL,javascript,iframe,cross-domain,Javascript,Iframe,Cross Domain,好的,我有一页,在这一页我有一个iframe。我需要做的是在iframe页面上,找出主页的URL是什么 我到处搜索过,我知道如果我的iframe页面位于不同的域上,这是不可能的,因为这是跨站点脚本。但我所读到的所有地方都说,如果iframe页面与父页面位于同一个域中,那么它应该可以工作,例如: parent.document.location 。。。或者其他类似的组合,因为似乎有多种方法可以获得相同的信息 总之,问题出在这里。我的iframe与主页在同一个域中,但它不在同一个子域中。比如说我有

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

我到处搜索过,我知道如果我的iframe页面位于不同的域上,这是不可能的,因为这是跨站点脚本。但我所读到的所有地方都说,如果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 extract
thisdomain.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 "";
}